.NET のスレッドを正常に終了します
.NET でスレッドを終了するときは、不安定になる可能性があるため、悪名高い Thread.Abort() メソッドの使用を必ず避けてください。対照的に、揮発性ブール チェックやタスク並列ライブラリ (TPL) メカニズムなどのプロアクティブな戦略は、より安全な代替手段を提供します。
Volatile Bool を使用したコラボレーションのキャンセル
スタック オーバーフローの応答で言及されているユーザー ポリシーと同様に、1 つのアプローチには、揮発性ブール値 _shouldStop
の実装が含まれます。スレッドのコード内でこのフラグを定期的にチェックして、フラグが通知されたときにスレッドが正常に終了できるようにします。このアプローチは周期的なプロセスにはうまく機能しますが、より複雑なビジネス運営には面倒すぎるように見えるかもしれません。
TPL キャンセルメカニズム
TPL は、CancellationToken
と CancellationTokenSource
を提供することで、より洗練されたソリューションを導入します。 CancellationToken
を取得し、その IsCancellationRequested
属性を定期的に検証することで、スレッドはキャンセル要求に応答できます。 CancellationTokenSource
は、この動作をトリガーする Cancel
メソッドを提供します。
スケジュールされた操作の待機ハンドル
間隔またはシグナルを待機する必要があるスレッドの場合、待機ハンドル (ManualResetEvent
など) またはスレッド同期プリミティブ (Monitor.Wait()
など) が効率的なソリューションを提供します。 ManualResetEvent
を設定するか、Monitor.Pulse()
を発行すると、スレッドに停止の信号を送り、呼び出しをブロックしている最中でも正常に終了できるようになります。
特別なシナリオとスレッドの中断
特別なシナリオには、独自のスレッド終了メカニズムが存在する場合があります。たとえば、Socket.Close()
は Send()
または Receive()
操作に割り込み、スレッドのブロックを解除できます。 Thread.Interrupt
はそのシンプルさから魅力的に見えるかもしれませんが、特定の BCL ブロッキング呼び出しのみを中断でき、安全な中断ポイントを特定するのが困難な場合が多いため、使用には注意が必要です。
最終的に、スレッド終了戦略の選択は、特定のシナリオによって異なります。 Thread.Abort()
の代わりにこれらのメソッドのいずれかを実装すると、コードの整合性を維持し、アプリケーションの安定性を最大化しながら、スレッドを確実に終了できます。
以上がThread.Abort() を使用せずに .NET でスレッドを正常に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。