私はいくつかのタスクを委任するスレッドを実行しています。単一のタスクが完了すると、完了したというイベントが発生します。これらのタスクは、特定の順序で実行する必要があり、前のタスクが完了するまで待つ必要があります。スレッドが「タスクが完了しました」イベントを受信するまでスレッドを待機させるにはどうすればよいですか? (フラグを設定してからフラグをポーリングする明白なイベントハンドラを除いて)スレッドをイベント待ちにしてから実行を継続するために使用できるメソッドはどれですか?
15
A
答えて
27
は、私はよくAutoResetEvent
待機ハンドルを使用しています。
最初に処理する必要があるスレッドはresetEventを受け取り、イベントが終了するまで待機します。
待機する必要のあるスレッドは、ハンドルを保持してresetEvent.WaitOne()を呼び出すことができます。これにより、最初の完了までスレッドがブロックされます。
これにより、非常にクリーンな方法でイベントのブロッキングとオーダーを処理できます。
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
}
1
あなたはこのためManualResetEventを使用することができます。私は、非同期タスクが完了するまで待機する必要がある場合
0
私はワーカースレッドが完了したときに呼び出すコールバックメソッドを使用することで良い結果が得られました。それはポーリングに勝つため、パラメータを呼び出し側に簡単に渡すことができます。
関連する問題
- 1. 同じスレッドで実行を待ってから、どのように継続を取得できますか?
- 2. スレッドからコンストラクタを使用してメソッドを実行する
- 3. は、ちらつきなしで別のプログラムを連続して実行するためのLinuxプログラムですか?
- 4. C#で待ち受け可能なメソッドでイベントを処理するために使用するパターン#
- 5. スレッドがブロックしているときにExecutorServiceが実行を継続するのはなぜですか?
- 6. 別のスレッドからメインスレッドでメソッドを実行できますか?
- 7. ソケットとスレッドを使用しているサーバーからのメッセージを待ちます
- 8. プライベートコンストラクタを使用してfinalクラスからメソッドを実行するにはどうすればよいですか?
- 9. サーバで実行中のスレッドからCDIイベントを起動するにはどうすればよいですか?
- 10. イベント接続に静的IBActionメソッドを使用できますか?
- 11. 継承:親ポインタから継承したメソッドを使用する
- 12. プロトコルを使用して同時実行スレッドを実装するにはどうすればよいですか?
- 13. Mockito新しいスレッドからメソッドを何回も実行するのを待つ
- 14. スレッドやプロセスはどちらを使うべきですか?
- 15. 「apprequests」メソッドを使用して、ユーザーが自分のアプリに友だちを招待できるようにするにはどうすればよいですか?
- 16. どのように私はアンドロイドサービスを継続的に実行できますか
- 17. 待ち行列に入れられたイベントで画像がアップロードされる
- 18. Pythonスレッドをカウントダウンしてからアクションを実行するにはどうしたらいいですか?
- 19. 待機スレッドでスレッド2を実行して通知する
- 20. C++は継続継承スタイルをどのように使用できますか?
- 21. Androidスレッド - 別のスレッドからスレッドを実行し、ハンドラメッセージを待っています
- 22. ジオフェンスを超えたときに実行されるメソッドはどれですか?
- 23. イベントリスナーの実行を待たずにイベントを発生させるにはどうすればよいですか?
- 24. JavaアプリケーションのMainメソッドからスレッドを実行するにはどうすればよいですか?
- 25. C#スレッド化、スレッドをパラメタでメソッドを実行するには?
- 26. 別のテンプレートからonRenderedイベントを待つメソッドを作成するにはどうすればよいですか?
- 27. Big Queryには常に待ち時間があるのはなぜですか?待ち時間なしで実行できるのですか?
- 28. GitLabをレポとして継続的に統合して使用する場合、codereviewを実行するにはどうすればいいですか?
- 29. JSの一部を継続的に実行できますか?
- 30. スレッドを使用してメソッドを実行する
最初の答えに基づいて、私はこれに非常に類似した何かをやっています。 EventResetMode.AutoResetで初期化されたAutoResetEventとEventWaitHandleの違いは何ですか? – MGSoto
@MGSoto:違いはあると思います。もしあれば、 'AutoResetEvent'は' EventWaitHandle'を継承し、その基本クラスのコンストラクタを使って 'EventResetMode.AutoReset'を渡しているようです。 –
AutoResetEvent、WaitHandlesなどがIDisposableを実装していることを忘れないでください –