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

C# 異步編程與列表任務取消詳解

開發 前端
在實際開發中,我們經常需要處理耗時的異步操作,比如網絡請求、文件讀寫等。有時候,我們可能需要取消這些正在進行的異步操作。本文將詳細介紹如何在C#中實現異步操作的取消機制。

在實際開發中,我們經常需要處理耗時的異步操作,比如網絡請求、文件讀寫等。有時候,我們可能需要取消這些正在進行的異步操作。本文將詳細介紹如何在C#中實現異步操作的取消機制。

前置條件

  • .NET 5.0或更高版本
  • Visual Studio或Visual Studio Code
  • 基本的C#異步編程知識

核心概念

在開始之前,讓我們了解幾個重要的概念:

  1. CancellationTokenSource用于發出取消信號的源
  2. CancellationToken用于接收取消信號的令牌
  3. Task表示異步操作的對象

完整示例代碼

下面是一個完整的示例,展示如何實現可取消的異步操作:

using System.Diagnostics;

namespace AppCancellationToken
{
    internal class Program
    {
        // 創建取消令牌源
        static readonly CancellationTokenSource s_cts = new CancellationTokenSource();

        // 創建HttpClient實例
        static readonly HttpClient s_client = new HttpClient
        {
            MaxResponseContentBufferSize = 1_000_000
        };

        // 待下載的URL列表
        static readonly IEnumerable<string> s_urlList = newstring[]
        {
        "https://learn.microsoft.com",
        "https://learn.microsoft.com/dotnet",
        "https://learn.microsoft.com/azure",
        "https://learn.microsoft.com/visualstudio"
        };

        static async Task Main()
        {
            Console.WriteLine("程序啟動...");
            Console.WriteLine("按回車鍵取消下載...\n");

            // 創建監聽取消的任務
            Task cancelTask = Task.Run(() =>
            {
                while (Console.ReadKey().Key != ConsoleKey.Enter)
                {
                    Console.WriteLine("按回車鍵取消下載...");
                }
                Console.WriteLine("\n檢測到回車鍵:正在取消下載...\n");
                s_cts.Cancel();
            });

            // 創建下載任務
            Task sumPageSizesTask = SumPageSizesAsync();

            // 等待任意一個任務完成
            Task finishedTask = await Task.WhenAny(cancelTask, sumPageSizesTask);

            if (finishedTask == cancelTask)
            {
                try
                {
                    await sumPageSizesTask;
                    Console.WriteLine("在處理取消請求之前下載任務已完成。");
                }
                catch (OperationCanceledException)
                {
                    Console.WriteLine("下載任務已被取消。");
                }
            }

            Console.WriteLine("程序結束。");
        }

        static async Task SumPageSizesAsync()
        {
            var stopwatch = Stopwatch.StartNew();
            int total = 0;

            foreach (string url in s_urlList)
            {
                int contentLength = await ProcessUrlAsync(url, s_client, s_cts.Token);
                total += contentLength;
            }

            stopwatch.Stop();
            Console.WriteLine($"\n總計下載字節數: {total:#,#}");
            Console.WriteLine($"耗時: {stopwatch.Elapsed}\n");
        }

        static async Task<int> ProcessUrlAsync(string url, HttpClient client, CancellationToken token)
        {
            HttpResponseMessage response = await client.GetAsync(url, token);
            byte[] content = await response.Content.ReadAsByteArrayAsync(token);
            Console.WriteLine($"{url,-60} {content.Length,10:#,#}");
            return content.Length;
        }
    }
}

代碼詳解

初始化設置 

static readonly CancellationTokenSource s_cts = new CancellationTokenSource();
static readonly HttpClient s_client = new HttpClient { MaxResponseContentBufferSize = 1_000_000 };
  • 創建CancellationTokenSource實例用于發出取消信號
  • 創建HttpClient實例用于發送HTTP請求
  • 使用static readonly確保這些實例在整個應用程序生命周期內只創建一次

主方法實現 

主方法使用async Task Main()實現異步入口點,包含兩個主要任務:

  1. 取消監聽任務(cancelTask)
  2. 下載處理任務(sumPageSizesTask)

異步下載實現 

ProcessUrlAsync方法實現了單個URL的下載邏輯:

static async Task<int> ProcessUrlAsync(string url, HttpClient client, CancellationToken token)
{
    HttpResponseMessage response = await client.GetAsync(url, token);
    byte[] content = await response.Content.ReadAsByteArrayAsync(token);
    Console.WriteLine($"{url,-60} {content.Length,10:#,#}");
    return content.Length;
}
  • 使用GetAsync方法發送HTTP請求
  • 傳入CancellationToken支持取消操作
  • 返回下載內容的字節數

運行效果

程序運行后會顯示如下輸出:

圖片圖片

注意

  1. 始終使用using語句或字段初始化方式創建CancellationTokenSource
  2. 在所有可取消的異步操作中傳遞CancellationToken
  3. 正確處理取消異常
  4. 使用static readonly創建長期使用的HTTP客戶端實例

總結

這種模式適用于需要支持用戶取消的長時間運行的異步操作,如網絡請求、文件下載等場景。

責任編輯:武曉燕 來源: 技術老小子
相關推薦

2015-09-16 15:11:58

C#異步編程

2021-10-12 17:47:22

C# TAP異步

2009-08-20 17:30:56

C#異步編程模式

2010-12-22 10:21:17

C#基礎

2009-08-21 10:13:02

C#異步初步

2009-08-25 17:13:57

C#串口編程

2024-03-04 18:49:59

反射C#開發

2024-04-09 08:04:42

C#結構await

2009-04-10 09:55:44

C#反射.NET

2012-07-27 10:02:39

C#

2009-08-20 16:33:44

Socket異步通訊

2024-12-23 09:09:54

2009-08-25 10:57:09

C#接口

2009-08-25 10:44:08

C#接口定義接口

2016-12-14 15:05:08

C#異步編程

2009-08-20 17:47:54

C#異步編程模式

2024-10-15 08:29:09

C#軟件開發

2016-09-07 20:43:36

Javascript異步編程

2009-08-07 16:19:00

C#下數據庫編程

2009-08-24 18:22:05

C# 泛型編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品美女久久久久aⅴ国产馆 | 亚洲欧美综合精品另类天天更新 | 中文字幕国产一区 | 精品欧美激情精品一区 | 欧美中文在线 | 欧美国产日韩在线观看成人 | 国产精品美女在线观看 | 久久久精品一区二区三区 | 亚洲午夜久久久 | av一级 | 国产探花在线精品一区二区 | 亚洲第一成人av | 免费在线观看毛片 | 久色 | 成人av在线网站 | tube国产 | 国产 日韩 欧美 在线 | 国产午夜精品视频 | 午夜性色a√在线视频观看9 | 亚洲人成人一区二区在线观看 | av一二三四 | 精品一区二区在线看 | 国产精品久久久久久久久久久免费看 | 日本午夜精品 | 日韩一区二区免费视频 | 欧美www在线| 一区二区三区视频在线观看 | 欧美精品片| 国产乱码精品一品二品 | 高清人人天天夜夜曰狠狠狠狠 | 精品视频在线观看 | 日韩成人免费av | 激情五月婷婷 | 久久久久久久久99 | 国产区免费视频 | 北条麻妃国产九九九精品小说 | 中文字幕成人av | 国产成人精品一区二区三区在线观看 | h在线看 | 男女污污动态图 | 成人三级视频 |