Thread.Abort()
がスレッドを終了する理想的な方法ではないことはよく知られていますが、より洗練された代替方法を見つけるのは簡単ではありません。この記事では、単純なループ アプローチが実現できないシナリオに焦点を当て、.NET でスレッドを正常に終了するための高度な戦略について説明します。
変更可能なブール値チェックの使用は、共同キャンセルの一般的な手法です。ただし、このアプローチは、多数の非周期操作を含む複雑なバックグラウンド プロセスには適さない場合があります。
この場合、ワーカー関数全体に散在する停止メカニズムを含む while
ループを配置することが必要になる場合があります。しかし、これは面倒で間違いが発生しやすくなります。
他にもいくつかの共同キャンセルメカニズムがあります:
CancellationTokenSource
と CancellationToken
を使用します。ワーカー スレッドは、キャンセル リクエストのトークンを定期的にチェックします。 ManualResetEvent
など) を使用します。スレッドは、定期的に、または他のイベントを待機している間に、シグナルの待機ハンドルをチェックします。 Thread.Interrupt
は単純に見えますが、いくつかの制限があります。これは、BCL 内の特定のブロック呼び出し (例: Thread.Sleep
) に例外を挿入することで機能します。したがって、その有効性は、これらのブロッキング呼び出しがコード内のどこに配置されるかによって決まります。
一部のシナリオには、独自のスレッド終了メカニズムがあります:
Socket
クラスを使用すると、Send
または Receive
操作がブロックされているときに Close
を呼び出してスレッドを中断できます。 Interlocked
クラスは、アトミックな更新とスレッド同期の実装に使用できるメソッド (Interlocked.CompareExchange
など) を提供します。 .NET でスレッドを正常に終了するには、特定のシナリオと利用可能な戦略を慎重に検討する必要があります。一般に協調キャンセル技術が適していますが、場合によっては専用のメカニズムの方が適切な場合もあります。開発者は、信頼性が高く効率的なスレッド管理を確保するために、アプリケーションのニーズに最も適した方法を選択する必要があります。
以上が単純なループベースのアプローチ以外に、.NET でスレッドを正常に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。