0

我使用 aThreadPool来并行执行多个进程,就像这里显示 的那样,不同之处在于我使用一些参数启动了我自己的进程/程序。简而言之,这个程序会计算一些值并将它们写入一个文本文件,然后我会进行比较。

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管理大量线程?类似于队列的东西,当其他进程完成时启动新进程。简单地说,在我的情况下,进程 = 线程。

4

1 回答 1

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 个进程。然后是操作系统如何处理这个问题。

于 2012-11-07T15:25:19.507 回答