0

我有一个包含几个项目的列表框。我正在寻找一种简单的方法来每次运行特定数量的线程捆绑。我如何控制我的线程束是否已经结束并且我应该开始下一个线程束。

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);
}

谢谢

4

3 回答 3

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事件被引发时,你就知道你的线程已经结束了。

于 2013-05-12T10:20:56.757 回答
0

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

也就是说,我会选择不同的设置:

  • 将这种线程管理放在一个单独的类中(不绑定到 UI)

  • 使用任务并行库将线程的创建留给运行时,创建任务并将捆绑留给运行时(带走大量管理代码并扩展到硬件。

于 2013-05-12T10:24:40.180 回答
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));

(因为我没有所有的代码(比如Deploy,和vList)我不确定它是否会编译,但这只是一个方向。)

于 2013-05-12T10:44:53.957 回答