在 C# 中有效處理任務取消
CancellationToken.CancelNotification
方法本身並不能停止正在運行的任務;它只是表示取消。 為了確保任務在取消時干淨地終止,您必須主動將取消處理合併到任務的邏輯中。
利用基於任務的異步模式 (TAP)
最有效的方法是持續使用 TAP 和 CancellationToken
:
CancellationToken
: 將 CancellationToken
參數合併到每個可以取消的方法中。 cancellationToken.ThrowIfCancellationRequested()
定期檢查令牌的狀態。 如果檢測到取消,則拋出異常以停止執行。 使用 TAP 修訂的代碼示例
這個改進的示例演示了正確的取消處理:
<code class="language-csharp">private async Task TryTask() { using (var source = new CancellationTokenSource()) { source.CancelAfter(TimeSpan.FromSeconds(1)); try { Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); int result = await task; // Await will re-throw any exceptions. Console.WriteLine($"Task completed successfully: {result}"); } catch (OperationCanceledException) { Console.WriteLine("Task cancelled successfully."); } } } private int slowFunc(int a, int b, CancellationToken cancellationToken) { for (int i = 0; i < 1000000; i++) { cancellationToken.ThrowIfCancellationRequested(); // Check for cancellation // ... your long-running operation ... } return a + b; }</code>
說明:
using
聲明: 即使發生異常,也確保 CancellationTokenSource
得到正確處置。 try-catch
塊: 處理 OperationCanceledException
拋出的 cancellationToken.ThrowIfCancellationRequested()
,提供乾淨的取消處理。 slowFunc
: cancellationToken.ThrowIfCancellationRequested()
調用策略性地放置在循環中,允許頻繁的取消檢查。 這可以防止請求取消後不必要的工作。 這種修改後的方法可保證任務在請求取消時立即停止,從而防止資源洩漏並提高整體應用程序響應能力。
以上是在C#中取消時,如何正確停止任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!