WaitHandle.WaitAll の動作について質問があり、助けていただければ幸いです。
私がそのような状況にあると仮定しましょう: 親スレッドがいくつかの子スレッドを開いているため、子スレッドが作業を完了するまで「他の処理を実行中」で待機する必要があります。
私は WaitHandle.WaitAll を使用しており、このメソッドを使い続けたいと考えています。(NO Thread.Join など、お願いします :) )
ManualResetEvent[] events = new ManualResetEvent[list.Count];
foreach (string row in list)
{
events[i] = new ManualResetEvent(false);
Thread thread = new Thread(new ParameterizedThreadStart(DoSomething));
thread.Start(events[i]); // start child thread
System.Threading.Thread.Sleep(1000000);
i++;
}
WaitHandle.WaitAll(events); // wait for child threads finish their work
...
...
private DoSomething(object sth)
{
// some stuff that executes only 1 second
ManualResetEvent.Set()
}
したがって、最初に新しく開始された子スレッドの状況は、ManualResetEvent.Set() の呼び出しが、親スレッドで WaitHandle.WaitAll(events) を呼び出す前であるということです。新しい子スレッドを開くループには長いタイムアウトがあるためです。
私の質問は、そのような時系列の問題ではないでしょうか? ManualResetEvent.Set() を呼び出す前に、WaitHandle.WaitAll を呼び出すべきではありませんか?