在C#中,異步編程是處理耗時操作,如I/O請求、數據庫調用或網絡請求等,而不阻塞主線程的一種有效方法。Task 類是這種異步操作的核心,它允許我們啟動異步操作并等待其完成。然而,有時我們可能需要在任務完成之前取消它,特別是當任務依賴于某些外部條件或用戶交互時。在C#中,取消任務通常通過使用 CancellationToken 來實現。
CancellationToken 是一個結構,用于傳遞取消操作的通知,如用戶請求取消或超時。CancellationTokenSource 是用于生成 CancellationToken 的類,并提供了取消該令牌的方法。
下面是一個簡單的示例,展示了如何使用 CancellationToken 和 CancellationTokenSource 來取消一個任務:
using System;using System.Threading;using System.Threading.Tasks;class Program{ static async Task Main(string[] args) { using CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken cancellationToken = cts.Token; // 啟動一個可以被取消的任務 Task myTask = Task.Run(() => DoWork(cancellationToken), cancellationToken); // 假設一段時間后,我們決定取消任務 await Task.Delay(2000); // 等待2秒 Console.WriteLine("Cancelling the task..."); cts.Cancel(); // 發送取消信號 try { await myTask; // 等待任務完成或捕獲到OperationCanceledException異常 } catch (OperationCanceledException) { Console.WriteLine("Task was cancelled"); } } static void DoWork(CancellationToken cancellationToken) { for (int i = 0; i < 10; i++) { if (cancellationToken.IsCancellationRequested) { Console.WriteLine("Cancellation requested."); // 檢查取消標記,如果已請求取消,則退出循環或執行其他清理操作 break; // 或者返回,拋出OperationCanceledException等。 } // 模擬工作正在進行中... Thread.Sleep(500); // 不要在生產代碼中使用Thread.Sleep! 這里只是為了示例。 Console.WriteLine("Working..."); } }}
在這個示例中,我們創建了一個 CancellationTokenSource 實例,并使用其 Token 屬性生成了一個 CancellationToken。然后,我們將這個令牌傳遞給了一個在后臺運行的任務(通過 Task.Run)。稍后,我們決定取消這個任務,于是調用了 CancellationTokenSource.Cancel 方法來提供取消信號。在任務代碼中,我們定期檢查取消標記,如果已請求取消,則退出循環。
本文鏈接:http://www.tebozhan.com/showinfo-26-82183-0.htmlC# 中取消任務(Task)的正確方式
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 四萬字102道Java多線程經典面試題
下一篇: 我們一起聊聊架構復雜度來源高可用