0

ここThreadPoolに示すように、いくつかのパラメーターを使用 して独自のプロセス/プログラムを開始するという違いがあります。簡単に言うと、このプログラムはいくつかの値を計算し、それらをテキスト ファイルに書き込みます。後で比較します。

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 プロセスだけを実行する必要があります。次に、OSがこれをどのように処理するかが問題になります。

于 2012-11-07T15:25:19.507 に答える