成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C# 中取消任務(Task)的正確方式

開發 前端
CancellationToken? 是一個結構,用于傳遞取消操作的通知,如用戶請求取消或超時。CancellationTokenSource? 是用于生成 CancellationToken 的類,并提供了取消該令牌的方法。

在C#中,異步編程是處理耗時操作,如I/O請求、數據庫調用或網絡請求等,而不阻塞主線程的一種有效方法。Task 類是這種異步操作的核心,它允許我們啟動異步操作并等待其完成。然而,有時我們可能需要在任務完成之前取消它,特別是當任務依賴于某些外部條件或用戶交互時。在C#中,取消任務通常通過使用 CancellationToken 來實現。

CancellationToken 和 CancellationTokenSource

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 方法來提供取消信號。在任務代碼中,我們定期檢查取消標記,如果已請求取消,則退出循環。

注意事項和最佳實踐:

  1. 定期檢查取消標記:在你的任務代碼中,你應該定期檢查 CancellationToken.IsCancellationRequested 屬性,以便在收到取消請求時能夠迅速響應。
  2. 處理取消請求:當檢測到取消請求時,你的代碼應該盡快停止當前的操作并退出。你可以通過拋出 OperationCanceledException 異常、返回或執行其他適當的清理操作來實現這一點。
  3. 使用正確的等待方式:在等待可能被取消的任務時,最好使用 await 關鍵字而不是 Task.Wait() 或 Task.Result,因為后者在任務被取消時會拋出 AggregateException 而不是 OperationCanceledException,這可能會使異常處理更加復雜。
  4. 資源清理:確保在取消操作后妥善處理和清理所有已分配的資源,以避免內存泄漏或其他潛在問題。這包括關閉文件句柄、釋放數據庫連接等。
  5. 文檔和測試:如果你的方法接受一個 CancellationToken 參數,確保在方法的文檔中明確說明這一點,并編寫針對取消操作的單元測試,以確保你的代碼在收到取消信號時能夠正確響應。
責任編輯:武曉燕 來源: 程序員編程日記
相關推薦

2025-04-30 01:50:00

C#異步編程

2024-05-13 11:36:56

C#線程

2024-04-01 11:30:57

C#拷貝

2011-08-29 10:35:53

反射方式C#

2024-05-11 07:13:33

C#Task編程

2024-12-23 06:20:00

2024-03-06 13:23:56

Task.RunC#異步陷阱

2024-12-20 09:48:47

C#Python代碼

2011-03-25 09:08:49

C#

2009-06-24 10:49:16

JavaScript

2009-05-13 11:50:17

C#多繼承接口

2024-06-20 11:52:44

C#占位符代碼

2024-05-16 11:04:06

C#異步編程編程

2009-07-31 18:28:46

實現C#顯示圖像

2009-05-26 16:33:48

PythonC#Run As

2024-09-13 08:27:00

2010-06-02 16:36:38

連接MySQL中文亂碼

2023-03-10 22:14:49

KustomizeKubernetes

2025-03-21 09:01:34

Swift任務取消機制協作式取消

2024-11-25 15:00:00

C#定時任務開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一级电影 | www.亚洲 | 91传媒在线观看 | 亚洲激情在线视频 | 亚洲一区二区中文字幕在线观看 | 亚洲伊人久久综合 | 免费中文字幕 | 日韩精品在线视频 | 欧美精品一区在线发布 | 99一区二区 | 一本一道久久a久久精品综合蜜臀 | 羞羞视频在线观看免费观看 | 夜夜骚视频 | 最新日韩欧美 | 久久久91精品国产一区二区精品 | 91欧美| 日韩视频观看 | aa级毛片毛片免费观看久 | 久久精品69 | 成人午夜视频在线观看 | 国产精品永久久久久 | 亚洲高清视频一区 | 欧美一级免费片 | 久久免费精品视频 | 国产视频线观看永久免费 | 欧美精品一区二区三区在线播放 | 久久精品视频免费观看 | 综合二区 | 亚洲aⅴ | 亚洲a视| 91秦先生艺校小琴 | 亚洲一区视频 | 久久精品国产久精国产 | 天堂va在线观看 | 老妇激情毛片免费 | 国产一区二区三区视频免费观看 | 999免费视频| av国产精品毛片一区二区小说 | 91精品中文字幕一区二区三区 | 午夜羞羞 | 人人干免费 |