.NET タスクの安全な停止: Thread.Abort()
Thread.Abort()
で強制的に停止できるスレッドとは異なり、.NET 4.0 以降のタスクには即時終了に直接相当する機能がありません。キャンセル トークンは正常な終了戦略を提供しますが、状況によってはタスクを直ちに中断する必要があります。
タスクの即時終了が必要なシナリオ
並列ループ内で同期 Web サービス呼び出しのブロックを実行する Windows フォーム アプリケーションを考えてみましょう。
<code class="language-csharp">CancellationTokenSource cts = new CancellationTokenSource(); ParallelOptions po = new ParallelOptions(); po.CancellationToken = cts.Token; po.MaxDegreeOfParallelism = System.Environment.ProcessorCount; Parallel.ForEach(iListOfItems, po, (item, loopState) => { Thread.Sleep(120000); // Simulates a web service call });</code>
ユーザーがプロセスの途中でアプリケーションを閉じた場合、並列ループのスレッドは実行を継続し、遅延やアプリケーションのフリーズが発生する可能性があります。
キャンセルトークンを超えて
キャンセル トークンは正常な終了には理想的ですが、通話をブロックすると効果が低くなります。 より堅牢な解決策には、タスク ループ内でチェックされるブール フラグ stopExecuting
が含まれ、即時停止を通知します。
<code class="language-csharp">bool stopExecuting; Parallel.ForEach(iListOfItems, po, (item, loopState) => { if (stopExecuting) { loopState.Stop(); return; } // Task execution code });</code>
ユーザーがフォームを閉じるときに stopExecuting
を true
に設定すると、実行中のすべてのタスクが停止します。 ただし、これによって、すでに実行されているブロッキング呼び出しによる遅延が解消されるわけではありません。
Thread.Abort()
– 最後の手段
Thread.Abort()
は、最後の手段として並列ループによって生成されたスレッドで使用できますが、システムが不安定になる可能性があるため、これは強く推奨されません。
スレッドセーフな共有フラグを使用し、即時終了のためのキャンセル トークンを回避すると、タスクの迅速な中断が必要なシナリオに対して、より安全で管理しやすいアプローチが提供されます。
以上がThread.Abort() を使用せずに .NET で長時間実行されているタスクを安全に中断する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。