并行处理大量进程

时间:2012-11-07 13:11:51

标签: c# process parallel-processing threadpool

我使用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类是否有可能管理大量线程?类似于队列的东西,当其他已完成时启动新进程。 简单来说,就我而言,一个进程=线程。

1 个答案:

答案 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个进程。那么操作系统将如何处理这个问题。