.NET でスレッドから別のスレッドにシグナルを送信する最善の方法は何ですか?
-
02-07-2019 - |
質問
ユーザーが実行を中断したい場合は、別のスレッドにシグナルを送る必要がありますが、シグナル伝達/シグナルチェックメカニズムを実装する方法がわかりません。私のプロジェクトにはシングルトン(グローバルのような)を入れたくありません。 bool
)ですが、代替手段はありますか?
で このスレッド 人々は C++ での適切な構造を提案していますが、.NET での同様のものについては知りません。誰か光を当ててくれませんか?
解決
試してみる 背景労働者. 。進行状況の更新と実行中のタスクのキャンセルをサポートします。
あるスレッドが別のスレッドの処理を完了するまで待機させたい場合は、MonitorResetEvent と同様に、Monitor.Wait と Monitor.Pulse が適しています。ただし、これらは実行中のタスクをキャンセルする場合には実際には役に立ちません。
独自のキャンセル コードを記述したい場合は、両方のスレッドがアクセスできるフィールドをどこかに置くだけで済みます。揮発性としてマークします。例:
private volatile bool cancelling;
メインスレッドでこれを true に設定し、ワーカー スレッドで定期的にチェックし、終了時に false に設定します。
セマフォ変数のスコープをクラスに対してプライベートに制限できるため、これは実際には「グローバル変数」を持つことと比較できません。
他のヒント
少し曖昧ですが(時間が短い)、調べてください。 ManualResetEvent と AutoResetEvent. 。また、Monitor および lock キーワードを検索することもできます。
Monitor.Wait と Monitor.Pulse を調べてください。.Net でのスレッド化に関する優れた記事は次のとおりです (非常に読みやすい)。 http://www.albahari.com/threading/part4.aspx
シナリオにとって過剰になる可能性があるフレームワークベースのソリューションとは対照的に、同期された静的ブール値のような単純なソリューションで十分です。それでもフレームワークが必要な場合は、以下を参照してください。 .NET への並列拡張 アイデアのために。
どのような種類の同期が必要かによって異なります。何らかの実行終了に達するまでループ内でスレッドを実行できるようにしたい場合、必要なのは静的な bool 変数だけです。あるスレッドが実行ポイントに到達するまで待機させたい場合は、WaitEvents (AutoResetEvent または ManualResetEvent) を使用するとよいでしょう。複数の waitHandle を待機する必要がある場合は、WaitHandle.WaitAll または WaitHandle.WaitAny を使用できます。
System.Runtime.Remoting 名前空間を見てください。