ワーカースレッドを作成するコンシューマスレッドがあります。これらのスレッドは、アクティブ状態と待機状態を切り替える必要があります。すべてのワーカースレッドが待機状態になると、現在のジョブが完了したことを意味します。コンシューマスレッドは、すべてのワーカースレッドが待機状態になるのを待たせることができますか?私は、すべてのワーカースレッドでThread.Join()と非常によく似た動作が必要ですが、スレッドを次のジョブのために実行し続けるようにします。ジョブがタイトなループにあり、新しいスレッドを作成するのはコストがかかるので、新しいスレッドを作成することはできません。スレッドを別のスレッドが覚醒するまで待機させるにはどうすればいいですか(C#)
答えて
私が知っている限り、あなたが望むことをする仕組みはありません。 (Thread.Joinはブロックすることはできませんが、これはオプションではありません)
あなたが提供した情報は、実際には複数のスレッドにまたがってステートマシンを構築しているようです。
私はSingletonを作成し、それをステートマシンとして持っています。スレッドはSingletonの状態に信号を送ることができます。
不確定な数のスレッドがあるように聞こえるので、それぞれのステータスをコレクションに入れる必要があります。ここではThread Safe Collectionsを見て、あなたの州の情報をどのように保存したいのかを見ていきます。
これが役に立ちます。
簡潔な回答(後で拡張することがあります)にお詫び申し上げますが、おそらくWaitHandle.WaitAllメソッドとManualResetEventを組み合わせたものです。 ManualResetEvent
オブジェクトは、作成時に各ワーカースレッドに渡し、アイドル状態になったときに通知し、ハンドルのセット全体をWaitHandle.WaitAll
メソッドに渡して、完了時に監視スレッドをスリープ状態にします。待機中に何らかのタスクを定期的に実行する場合や、タスクが長時間かかる場合に何らかの操作を実行する場合は、このメソッドのタイムアウト機能を使用することもできます。
操作が完了したときにワーカースレッドを終了させる場合(この場合は完全にはっきりしていない)、代わりにタスクとしてスポーンし、Task.WaitAllを使用する方が適切な場合があります。
編集:すばやく再読み込みすると、完全なワーカースレッドを再利用するのではなく、タスクを使用するように思えます。タスクは、スレッドプールから割り当てられたスレッドを使用するため、スレッドが(一般的に)準備ができて作業を待つため、心配していたスレッドの作成オーバーヘッドを排除します。それぞれのタスクをスポーンするだけで、すべてのタスクが完了するまで待つことができます。
- 1. スレッドをポーリングなしで待機させるにはどうすればよいですか?
- 2. スレッドをLinuxで別のスレッドのために待機させるには?
- 3. スレッドを別のスレッドの前に強制的に開始するにはどうすればよいですか?
- 4. 長い会話スレッドを視覚化するにはどうすればいいですか?
- 5. 別のスレッドが終了するまでスレッドを待ちますか?
- 6. 最大待機スレッドを変更するにはどうすればよいですか?
- 7. c#asp.net - 別のスレッドで現在のページURLを検索するにはどうすればよいですか?
- 8. C#の別のスレッドからリストを更新するにはどうすればよいですか?
- 9. Androidスレッド - 別のスレッドからスレッドを実行し、ハンドラメッセージを待っています
- 10. は、iosの別のスレッドが完了するまでロック待機を同期させますか?
- 11. Asp.net C#:他のスレッドがスレッド内で実行されているかどうかを確認します。
- 12. 作成されたスレッドとは別のスレッドから呼び出されるイベントハンドラを取得するにはどうすればよいですか?
- 13. JavaでJFrameを閉じるまでスレッドが待機するようにするにはどうすればよいですか?
- 14. 非同期要求が完了するまで.NET 4スレッドが待機するようにするにはどうすればよいですか?
- 15. OutOfMemoryError - 待機中のスレッドがガベージコレクトされないのはなぜですか?
- 16. Javaスレッドを待機させる
- 17. jQueryアニメーションが終了するまでスクリプトを待機させるにはどうすればよいですか?
- 18. dask.distributedからプログレスバーウィジェットを別のスレッドで実行するにはどうすればいいですか?
- 19. Javaでは、各スレッドが1つのコアで専用に実行されるようにスレッドを作成するにはどうすればよいですか?
- 20. .NETのメインUIスレッド以外のスレッドでUIを実行するにはどうすればよいですか?
- 21. 「待機スレッド」とは何ですか?
- 22. 他のスレッドがそのメソッドの実行を完了するまでスレッドを待機させる方法
- 23. 別のスレッドが存在するかどうかのスレッド同期
- 24. Java:スレッドを別のスレッドで監視するにはどうしたらいいですか?
- 25. NamedPipeServerStream.WaitForConnection()を別のスレッドで実行するにはどうすればいいですか?
- 26. Javaスレッドが実行されているコアを特定するにはどうすればよいですか?
- 27. スレッドが実行されているCPUを特定するにはどうすればよいですか?
- 28. スレッドでtrueを使用するにはどうすればよいですか?
- 29. Javaでスレッドをプロファイルするにはどうすればよいですか?
- 30. Javaでスレッドを使用するにはどうすればよいですか?
明示的なワーカースレッドを使用する必要がありますか?代わりに[タスク](https://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v = vs.110).aspx)としてそれらを表現できませんか?次に、[Task.WhenAll](https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.whenall(v = vs.110).aspx)を使用して、すべてのタスクが終了したかどうかを確認します。スレッドを使用する必要がある場合は、[AutoResetEvents](https://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(v = vs.110).aspx)と[WaitHandle .WaitAll](https://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitall(v = vs.110).aspx)。 –
ええ、タスクがうまくいくかもしれません。私が使用していた.netバージョンにタスクがあったかどうかはわかりませんでした。私はXamarinでMonoを使用しているためタイトなループでタスクを作成するのは間違っているかもしれません。ガベージコレクタはあまり良くありません。 – evg02gsa3