2009-08-07 4 views
15

私はいくつかのタスクを委任するスレッドを実行しています。単一のタスクが完了すると、完了したというイベントが発生します。これらのタスクは、特定の順序で実行する必要があり、前のタスクが完了するまで待つ必要があります。スレッドが「タスクが完了しました」イベントを受信するまでスレッドを待機させるにはどうすればよいですか? (フラグを設定してからフラグをポーリングする明白なイベントハンドラを除いて)スレッドをイベント待ちにしてから実行を継続するために使用できるメソッドはどれですか?

答えて

27

は、私はよくAutoResetEvent待機ハンドルを使用しています。

最初に処理する必要があるスレッドはresetEventを受け取り、イベントが終了するまで待機します。

待機する必要のあるスレッドは、ハンドルを保持してresetEvent.WaitOne()を呼び出すことができます。これにより、最初の完了までスレッドがブロックされます。

これにより、非常にクリーンな方法でイベントのブロッキングとオーダーを処理できます。

+1

最初の答えに基づいて、私はこれに非常に類似した何かをやっています。 EventResetMode.AutoResetで初期化されたAutoResetEventとEventWaitHandleの違いは何ですか? – MGSoto

+0

@MGSoto:違いはあると思います。もしあれば、 'AutoResetEvent'は' EventWaitHandle'を継承し、その基本クラスのコンストラクタを使って 'EventResetMode.AutoReset'を渡しているようです。 –

+2

AutoResetEvent、WaitHandlesなどがIDisposableを実装していることを忘れないでください –

5

1つのオプションは、完了を知らせるためにEventWaitHandleを使用することです。

public void PerformAsyncTasks() 
{ 
    SomeClass someObj = new SomeClass() 
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Completed" event 
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    { 
     waitHandle.Set(); // signal that the finished event was raised 
    } 
    someObj.TaskCompleted += eventHandler; 

    // call the async method 
    someObj.PerformFirstTaskAsync();  
    // Wait until the event handler is invoked 
    waitHandle.WaitOne(); 
    // the completed event has been raised, go on with the next one 
    someObj.PerformSecondTaskAsync(); 
    waitHandle.WaitOne(); 
    // ...and so on 
} 
+0

あなたは精緻化できますか?これをよりよく説明して、私は最も確実に投票します! – Firoso

+1

+1。 @firoso、msdnの記事には詳細があります。 –

+0

複数の言語での例を含む – bdonlan

1

あなたはこのためManualResetEventを使用することができます。私は、非同期タスクが完了するまで待機する必要がある場合

0

私はワーカースレッドが完了したときに呼び出すコールバックメソッドを使用することで良い結果が得られました。それはポーリングに勝つため、パラメータを呼び出し側に簡単に渡すことができます。

関連する問題