我使用ThreadPool
并行执行多个进程,如here所示
不同的是,我用一些参数启动我自己的进程/程序。简而言之,这个程序会计算一些值并将它们写入一个文本文件,然后我将其比较。
public void StartProcess()
{
string par = @"-p ""foo"" -c 17";
Process p = Process.Start(@"C:\MyProgramm.exe", par);
p.EnableRaisingEvents = true;
p.Exited += new EventHandler(p_Exited);
}
void p_Exited(object sender, EventArgs e)
{
// Indicates that the process has been completed
this.doneEvent.Set();
Console.WriteLine("thread {0} end...", ThreadIndex);
}
对于少量线程,它可以正常工作。在我的情况下,我必须开始大约200个线程,但在WaitHandle.WaitAll
方法中我得到NotSuppotedException
waitHandles中的对象数量大于系统 许可证。
我现在的问题是:ThreadPool
类是否有可能管理大量线程?类似于队列的东西,当其他已完成时启动新进程。
简单来说,就我而言,一个进程=线程。
答案 0 :(得分:0)
创建单个字段
private volatile int ProcessesStillRunning;
在开始流程之前,请将其初始化为正确的值
this.ProcessesStillRunning = 200;
this.StartProcesses(200);
// now wait on your doneEvent
修改处理程序,以便在进程退出
后减少此字段if (System.Threading.Interlocked.Decrement(ref this.ProcessesStillRunning) == 0)
this.doneEvent.Set();
当然,您现在应该不会使用任何.NET内置并行性限制,并且只运行200个进程。那么操作系统将如何处理这个问题。