2013-05-12 61 views
0

我有一个列表框中有几个项目。我正在寻找一种简单的方法来运行每次特定数量的线程包。如何控制我的捆绑线程是否已经结束,我应该开始下一个捆绑。C# - 如何从线程数组中创建一个定义的线程线程部分

foreach (ListViewItem item in listViewEx1.CheckedItems) 
{          
    vList.Add((V)item.Tag); 

    Thread tr = new Thread(new ParameterizedThreadStart(Deploy)); 
    threads.Add(tr); 
    tr.Start((object)item.Tag); 
} 

感谢

回答

0

您可以使用Semaphore倒计时运行线程的数量,并让线程释放它们的信号量声明。

这么说,我会去一个不同的设置:

  • 放这种线程管理的一个单独的类(不依赖于UI)

  • 离开线程的创建通过使用任务并行库运行时,创建Tasks离开捆绑的运行时(带走了大量的管理代码,并扩展到硬件。

+0

非常感谢您的帮助,您可以请附上代码片段来为我展示它。 – EldadC 2013-05-12 10:45:42

+0

为了演示什么?我希望你明白我不会写你的代码。尝试自己做,如果/当你卡住随时寻求帮助。 – 2013-05-12 11:06:16

+0

我通过使用Semaphore来限制正在运行的线程数来解决我的问题。 – EldadC 2013-07-15 19:32:55

0

为什么不使用的BackgroundWorker?

using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

BackgroundWorker bw = new BackgroundWorker(); 
bw.WorkerReportsProgress = true; 
bw.WorkerSupportsCancellation = true; 
bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 

if (bw.IsBusy != true) 
{ 
    bw.RunWorkerAsync(); 
} 
if (bw.WorkerSupportsCancellation == true) 
{ 
    bw.CancelAsync(); 
} 
private void bw_DoWork(object sender, DoWorkEventArgs e) { } 
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { } 
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { } 

bw_RunWorkerCompleted事件发生时,您知道您的线程已结束。

+0

嗨谢谢你的努力。所以对于每个新的线程都会创建一个新的bw对象,BW将取代常规的线程。 – EldadC 2013-05-12 10:58:57

+0

我的意见是如果可能的话,用后台工作人员替换你的线程。我不认为为每个线程创建一个后台工作者是一个好习惯(太多的线程!)。 – 2013-05-12 14:58:20

0

如果您使用的是.NET Framework 4.0中,你可以使用并行LINQ:

// First, fill the vList-collection. 
vList.AddRange(listView1.CheckedItems.Cast<ListViewItem>().Select(item => (V)item.Tag)); 
// Second, for each item, call Deploy, but do this parallel. 
listView1.CheckedItems.Cast<ListViewItem>().AsParallel().ForAll(item => Deploy(item.Tag)); 

(因为我没有所有的代码(如DeployvList)我不知道这是否会编译,但是这只是一个方向。)

+0

感谢您的帮助。部署只是我在线程中执行代码的方法。 vList是对象列表:列表 vmList =新列表(); – EldadC 2013-05-12 10:57:42

+0

什么是'VM'? VM与'V'不同吗?那么,这并不重要,我只是想指向你的方向'AsParallel'。 – 2013-05-12 11:04:00

+0

嗨,对不起V是VM,错过了它,VM是一个类。 – EldadC 2013-05-12 11:06:18

相关问题