0

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 を呼び出すべきではありませんか?

4

2 に答える 2

6

それはどうでもいい事です。すべてのイベントが通知される (設定される) と、待機が返されます。待機が呼び出される前または後に発生したかどうかは関係ありません。

于 2013-01-22T18:37:53.953 に答える
3

言われたとおり、それは問題ではありませんが、Taskクラスをそのようなものに使用することを検討する必要があります。

また、同時にまたは結果的にタスクを実行することもできます。

あなたのコードはこれだけになります:

Task.WaitAll(
    Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000);
    }),
    Task.Factory.StartNew(() => { Thread.Sleep(1000); }),
    Task.Factory.StartNew(() => { Thread.Sleep(1000); })
    );
于 2013-01-22T18:45:22.100 に答える