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