2017-02-08 3 views
0

ワーカースレッドを作成するコンシューマスレッドがあります。これらのスレッドは、アクティブ状態と待機状態を切り替える必要があります。すべてのワーカースレッドが待機状態になると、現在のジョブが完了したことを意味します。コンシューマスレッドは、すべてのワーカースレッドが待機状態になるのを待たせることができますか?私は、すべてのワーカースレッドでThread.Join()と非常によく似た動作が必要ですが、スレッドを次のジョブのために実行し続けるようにします。ジョブがタイトなループにあり、新しいスレッドを作成するのはコストがかかるので、新しいスレッドを作成することはできません。スレッドを別のスレッドが覚醒するまで待機させるにはどうすればいいですか(C#)

+1

明示的なワーカースレッドを使用する必要がありますか?代わりに[タスク](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)。 –

+0

ええ、タスクがうまくいくかもしれません。私が使用していた.netバージョンにタスクがあったかどうかはわかりませんでした。私はXamarinでMonoを使用しているためタイトなループでタスクを作成するのは間違っているかもしれません。ガベージコレクタはあまり良くありません。 – evg02gsa3

答えて

3

私が知っている限り、あなたが望むことをする仕組みはありません。 (Thread.Joinはブロックすることはできませんが、これはオプションではありません)

あなたが提供した情報は、実際には複数のスレッドにまたがってステートマシンを構築しているようです。

私はSingletonを作成し、それをステートマシンとして持っています。スレッドはSingletonの状態に信号を送ることができます。

不確定な数のスレッドがあるように聞こえるので、それぞれのステータスをコレクションに入れる必要があります。ここではThread Safe Collectionsを見て、あなたの州の情報をどのように保存したいのかを見ていきます。

これが役に立ちます。

3

簡潔な回答(後で拡張することがあります)にお詫び申し上げますが、おそらくWaitHandle.WaitAllメソッドとManualResetEventを組み合わせたものです。 ManualResetEventオブジェクトは、作成時に各ワーカースレッドに渡し、アイドル状態になったときに通知し、ハンドルのセット全体をWaitHandle.WaitAllメソッドに渡して、完了時に監視スレッドをスリープ状態にします。待機中に何らかのタスクを定期的に実行する場合や、タスクが長時間かかる場合に何らかの操作を実行する場合は、このメソッドのタイムアウト機能を使用することもできます。

操作が完了したときにワーカースレッドを終了させる場合(この場合は完全にはっきりしていない)、代わりにタスクとしてスポーンし、Task.WaitAllを使用する方が適切な場合があります。

編集:すばやく再読み込みすると、完全なワーカースレッドを再利用するのではなく、タスクを使用するように思えます。タスクは、スレッドプールから割り当てられたスレッドを使用するため、スレッドが(一般的に)準備ができて作業を待つため、心配していたスレッドの作成オーバーヘッドを排除します。それぞれのタスクをスポーンするだけで、すべてのタスクが完了するまで待つことができます。

関連する問題