避免使用Thread.Abort()取消TPL任務
在使用執行緒執行任務時,如果嘗試使用Abort()
方法終止線程,任務將繼續不受干擾地執行。這是因為任務使用線程池中的後台線程,而這些線程不受線程終止的影響。
替代方案:取消標記 (Cancellation Tokens)
為了將取消請求傳播到任務,應該使用取消標記。這些標記提供了一種協作的執行緒取消機制,它將取消請求表示為任務可以監視和回應的訊號。
使用取消標記的實作
以下程式碼片段示範如何使用取消標記實現任務取消:
<code class="language-csharp">// 创建一个取消标记源 var ts = new CancellationTokenSource(); // 从源获取取消标记 CancellationToken ct = ts.Token; // 创建一个新任务 Task.Factory.StartNew(() => { while (true) { // 执行繁重的计算 Thread.Sleep(100); // 检查取消请求 if (ct.IsCancellationRequested) { Console.WriteLine("任务已取消"); break; } } }, ct); // 模拟等待任务完成3秒 Thread.Sleep(3000); // 决定取消任务 ts.Cancel();</code>
關於.Abort()的注意事項
要注意的是,通常不建議使用Abort()
方法進行執行緒取消。此方法可能導致不可靠的行為和潛在的應用程式崩潰。取消標記為任務取消提供了更結構化和可靠的方法。
以上是如何在不使用Thread.Abort()的情況下有效取消TPL任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!