Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-如何从线程数组创建绑定线程的定义部分_C#_Multithreading_List - Fatal编程技术网

C#-如何从线程数组创建绑定线程的定义部分

C#-如何从线程数组创建绑定线程的定义部分,c#,multithreading,list,C#,Multithreading,List,我有一个包含几个项目的列表框。我正在寻找一种简单的方法,每次运行一个特定数量的线程包。我如何控制我的线程包是否已经结束,我应该开始下一个线程包 foreach (ListViewItem item in listViewEx1.CheckedItems) { vList.Add((V)item.Tag); Thread tr = new Thread(new ParameterizedThreadS

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

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

谢谢

为什么不使用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\u RunWorkerCompleted
事件时,您知道您的线程已结束。

您可以使用a来倒计时运行线程的数量,并让线程释放其信号量声明

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

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

  • 通过使用任务并行库,将线程的创建留给运行时,创建并将绑定留给运行时(需要大量管理代码并扩展到硬件)


如果您使用的是.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));
//首先,填写vList集合。
vList.AddRange(listView1.CheckedItems.Cast().Select(item=>(V)item.Tag));
//其次,对于每个项目,调用Deploy,但要并行执行此操作。
listView1.CheckedItems.Cast().AsParallel().ForAll(item=>Deploy(item.Tag));

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

非常感谢您的帮助,您能否附上s的代码片段来为我演示。演示什么?我希望您理解我不会编写您的代码。尝试自己编写代码,如果/当您遇到困难,请随时寻求帮助。我通过使用信号量限制运行线程的数量来解决我的问题。感谢您的帮助。Deploy只是我在线程中执行代码的方法。vList是一个对象列表:List vmList=new List();什么是
VM
?VM与
V
不同吗?好吧,这并不重要,我只是想告诉你
AsParallel
的方向。嗨,对不起,V是VM,错过了它,VM是一个类。嗨,谢谢你的努力。因此,对于每个新线程都将创建一个新的bw对象,bw将替换常规线程。我的意见是如果可能的话,用后台工作线程替换你的线程。我认为为每个线程创建一个后台工作线程(太多线程!)不是一个好的做法。