成人免费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

2024-11-25 15:00:00

C#定時任務開發

2025-03-21 09:01:34

Swift任務取消機制協作式取消
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线一区二区三区 | 精品一区二区视频 | 国产日韩一区二区三区 | 成人欧美一区二区三区 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 久久久91精品国产一区二区三区 | 国产目拍亚洲精品99久久精品 | 农村妇女毛片精品久久久 | 国产高清在线精品一区二区三区 | 一区精品在线观看 | 一区二区三区精品在线 | 色综网| 日本成人中文字幕 | av成年人网站 | 在线播放国产一区二区三区 | 日本综合在线观看 | 日本免费在线 | 一区二区三 | 国内精品在线视频 | 人人射人人| jlzzjlzz欧美大全| 69堂永久69tangcom | 日韩三级在线 | 亚洲婷婷六月天 | 日韩高清在线 | 巨大荫蒂视频欧美另类大 | 最新中文字幕 | 激情五月综合 | 欧美成人免费在线视频 | 亚洲视频一区二区三区 | 欧美在线一级 | www.日韩| 黄色大片免费网站 | 欧美久久久久 | 亚洲精品专区 | 精品国产乱码久久久久久丨区2区 | 久久国色 | 99久久久久久久久 | 高清人人天天夜夜曰狠狠狠狠 | 亚洲乱码国产乱码精品精的特点 | 国产成人精品午夜视频免费 |