C# 中的Task

文章目錄

  • 前言
  • 一、Task 的基本概念
  • 二、創建 Task
    • 使用異步方法
    • 使用 Task.Run 方法
  • 三、等待 Task 完成
    • 使用 await 關鍵字
    • 使用 Task.Wait 方法
  • 四、處理 Task 的異常
    • 使用 try-catch 塊
    • 使用 Task.Exception 屬性
  • 五、Task 的延續
    • 使用 ContinueWith 方法
    • 使用 await 關鍵字和異步方法
  • 六、Task 的并行執行
    • 使用多個 Task
    • 使用 Task.WhenAll 方法
  • 七、總結


前言

??在 C# 中,Task代表一個異步操作。它允許你在不阻塞主線程的情況下執行耗時的操作,從而提高應用程序的響應性和性能。本教程將詳細介紹 C# 中的Task。
在這里插入圖片描述

一、Task 的基本概念

??Task是.NET Framework 4.0 引入的一種異步編程模型,它代表一個可能尚未完成的操作。Task可以表示任何異步操作,例如文件讀取、網絡請求、數據庫查詢等。與傳統的異步編程模型相比,Task提供了一種更加簡潔和高效的方式來處理異步操作。

二、創建 Task

使用異步方法

??C# 中的異步方法通常以async關鍵字開頭,并返回一個Task或Task。例如:

   async Task<int> CalculateSumAsync(){int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;}

??在這個例子中,CalculateSumAsync方法是一個異步方法,它返回一個Task,表示一個異步操作,該操作將計算從 0 到 99 的整數之和,并返回結果。

使用 Task.Run 方法

??Task.Run方法可以將一個委托作為參數,并在一個新的線程上執行該委托。例如:

   Task<int> task = Task.Run(() =>{int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;});

??在這個例子中,Task.Run方法將一個 lambda 表達式作為參數,該表達式計算從 0 到 99 的整數之和,并返回結果。Task.Run方法返回一個Task,表示在新線程上執行的異步操作。

三、等待 Task 完成

使用 await 關鍵字

??await關鍵字用于等待一個Task完成。當使用await關鍵字等待一個Task時,當前方法會暫停執行,直到Task完成。例如:

   async Task<int> CalculateSumAsync(){int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;}async Task Main(){int result = await CalculateSumAsync();Console.WriteLine(result);}

??在這個例子中,Main方法是一個異步方法,它調用CalculateSumAsync方法,并使用await關鍵字等待該方法完成。一旦CalculateSumAsync方法完成,result變量將被賦值為該方法的返回值,并在控制臺上輸出結果。

使用 Task.Wait 方法

??Task.Wait方法用于等待一個Task完成。與await關鍵字不同,Task.Wait方法會阻塞當前線程,直到Task完成。例如:

   Task<int> task = Task.Run(() =>{int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;});task.Wait();int result = task.Result;Console.WriteLine(result);

??在這個例子中,task.Wait()方法會阻塞當前線程,直到task完成。一旦task完成,result變量將被賦值為task的返回值,并在控制臺上輸出結果。

四、處理 Task 的異常

使用 try-catch 塊

??當等待一個Task時,可以使用try-catch塊來捕獲Task中發生的異常。例如:

   async Task<int> CalculateSumAsync(){int sum = 0;for (int i = 0; i < 100; i++){sum += i;}throw new Exception("An error occurred.");return sum;}async Task Main(){try{int result = await CalculateSumAsync();Console.WriteLine(result);}catch (Exception ex){Console.WriteLine(ex.Message);}}

??在這個例子中,CalculateSumAsync方法在計算總和的過程中拋出了一個異常。在Main方法中,使用try-catch塊來捕獲這個異常,并在控制臺上輸出異常消息。

使用 Task.Exception 屬性

??Task.Exception屬性返回一個AggregateException,其中包含了Task中發生的所有異常。例如:

   Task<int> task = Task.Run(() =>{int sum = 0;for (int i = 0; i < 100; i++){sum += i;}throw new Exception("An error occurred.");return sum;});try{task.Wait();int result = task.Result;Console.WriteLine(result);}catch (AggregateException ex){foreach (var innerException in ex.InnerExceptions){Console.WriteLine(innerException.Message);}}

??在這個例子中,task.Wait()方法會阻塞當前線程,直到task完成。如果task中發生了異常,catch塊將捕獲AggregateException,并遍歷其中的所有異常,在控制臺上輸出異常消息。

五、Task 的延續

使用 ContinueWith 方法

??ContinueWith方法用于在一個Task完成后執行另一個操作。例如:

   Task<int> task = Task.Run(() =>{int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;});task.ContinueWith(t =>{Console.WriteLine(t.Result);});

??在這個例子中,task.ContinueWith方法在task完成后執行一個 lambda 表達式,該表達式輸出task的結果。

使用 await 關鍵字和異步方法

??也可以使用await關鍵字和異步方法來實現Task的延續。例如:

   async Task<int> CalculateSumAsync(){int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;}async Task PrintResultAsync(int result){Console.WriteLine(result);}async Task Main(){int result = await CalculateSumAsync();await PrintResultAsync(result);}

??在這個例子中,Main方法首先調用CalculateSumAsync方法,并使用await關鍵字等待該方法完成。然后,它調用PrintResultAsync方法,并使用await關鍵字等待該方法完成。這樣,PrintResultAsync方法就作為CalculateSumAsync方法的延續執行。

六、Task 的并行執行

使用多個 Task

??可以同時啟動多個Task,并等待它們全部完成。例如:

   Task<int> task1 = Task.Run(() =>{int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;});Task<int> task2 = Task.Run(() =>{int product = 1;for (int i = 1; i <= 10; i++){product *= i;}return product;});Task.WaitAll(task1, task2);int sum = task1.Result;int product = task2.Result;Console.WriteLine(sum);Console.WriteLine(product);

??在這個例子中,同時啟動了兩個Task,一個計算從 0 到 99 的整數之和,另一個計算從 1 到 10 的整數之積。然后,使用Task.WaitAll方法等待這兩個Task全部完成,并輸出結果。

使用 Task.WhenAll 方法

??Task.WhenAll方法返回一個Task,當所有傳入的Task都完成時,這個Task才完成。例如:

   Task<int> task1 = Task.Run(() =>{int sum = 0;for (int i = 0; i < 100; i++){sum += i;}return sum;});Task<int> task2 = Task.Run(() =>{int product = 1;for (int i = 1; i <= 10; i++){product *= i;}return product;});Task<int[]> tasks = Task.WhenAll(task1, task2);int[] results = await tasks;int sum = results[0];int product = results[1];Console.WriteLine(sum);Console.WriteLine(product);

??在這個例子中,使用Task.WhenAll方法等待兩個Task全部完成,并返回一個包含兩個Task結果的數組。然后,使用await關鍵字等待這個Task完成,并輸出結果。

七、總結

??Task是 C# 中一種強大的異步編程模型,它允許你在不阻塞主線程的情況下執行耗時的操作。通過使用Task,你可以提高應用程序的響應性和性能,同時保持代碼的簡潔和可讀性。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62802.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62802.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AIGC】如何高效使用ChatGPT挖掘AI最大潛能?26個Prompt提問秘訣幫你提升300%效率的!

還記得第一次使用ChatGPT時&#xff0c;那種既興奮又困惑的心情嗎&#xff1f;我是從一個對AI一知半解的普通用戶&#xff0c;逐步成長為現在的“ChatGPT大神”。這一過程并非一蹴而就&#xff0c;而是通過不斷的探索和實踐&#xff0c;掌握了一系列高效使用的技巧。今天&#…

浩辰CAD教程004:柱梁板

文章目錄 柱梁板標準柱角柱構造柱柱齊墻邊繪制梁繪制樓板 柱梁板 標準柱 繪制標準柱&#xff1a; ①&#xff1a;點選插入柱子②&#xff1a;沿著一根軸線布置柱子③&#xff1a;指定的矩形區域內的軸線交點插入柱子 替換現有柱子&#xff1a;選擇替換之后的柱子形狀&#x…

UNIX數據恢復—UNIX系統常見故障問題和數據恢復方案

UNIX系統常見故障表現&#xff1a; 1、存儲結構出錯&#xff1b; 2、數據刪除&#xff1b; 3、文件系統格式化&#xff1b; 4、其他原因數據丟失。 UNIX系統常見故障解決方案&#xff1a; 1、檢測UNIX系統故障涉及的設備是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…

橋接模式的理解和實踐

橋接模式&#xff08;Bridge Pattern&#xff09;&#xff0c;又稱橋梁模式&#xff0c;是一種結構型設計模式。它的核心思想是將抽象部分與實現部分分離&#xff0c;使它們可以獨立地進行變化&#xff0c;從而提高系統的靈活性和可擴展性。本文將詳細介紹橋接模式的概念、原理…

HTML綜合

一.HTML的初始結構 <!DOCTYPE html> <html lang"en"><head><!-- 設置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 設置網頁…

二維碼數據集,使用yolov,voc,coco標注,3044張各種二維碼原始圖片(未圖像增強)

二維碼數據集&#xff0c;使用yolov&#xff0c;voc&#xff0c;coco標注&#xff0c;3044張各種二維碼原始圖片&#xff08;未圖像增強&#xff09; 數據集分割 訓練組70&#xff05; 2132圖片 有效集20&#xff05; 607圖片 測試集10&#xff05; 305圖…

Python爬蟲技術的最新發展

在互聯網的海洋中&#xff0c;數據就像是一顆顆珍珠&#xff0c;而爬蟲技術就是我們手中的潛水艇。2024年&#xff0c;爬蟲技術有了哪些新花樣&#xff1f;讓我們一起潛入這個話題&#xff0c;看看最新的發展和趨勢。 1. 異步爬蟲&#xff1a;速度與激情 隨著現代Web應用的復…

用豆包MarsCode IDE,從0到1畫出精美數據大屏!

豆包MarsCode IDE 是一個云端 AI IDE 平臺&#xff0c;通過內置的 AI 編程助手&#xff0c;開箱即用的開發環境&#xff0c;可以幫助開發者更專注于各類項目的開發。 作為一名前端開發工程師&#xff0c;今天想嘗試利用豆包MarsCode IDE&#xff0c;選擇 Vue Echarts 創建一個…

游戲引擎學習第42天

倉庫: https://gitee.com/mrxiao_com/2d_game 簡介 目前我們正在研究的內容是如何構建一個基本的游戲引擎。我們將深入了解游戲開發的每一個環節&#xff0c;從最基礎的技術實現到高級的游戲編程。 角色移動代碼 我們主要討論的是角色的移動代碼。我一直希望能夠使用一些基…

Redis是什么?Redis和MongoDB的區別在那里?

Redis介紹 Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的、基于內存的數據結構存儲系統&#xff0c;它可以用作數據庫、緩存和消息中間件。以下是關于Redis的詳細介紹&#xff1a; 一、數據結構支持 字符串&#xff08;String&#xff09; 這是Redis最…

計算機網絡中的三大交換技術詳解與實現

目錄 計算機網絡中的三大交換技術詳解與實現1. 計算機網絡中的交換技術概述1.1 交換技術的意義1.2 三大交換技術簡介 2. 電路交換技術2.1 理論介紹2.2 Python實現及代碼詳解2.3 案例分析 3. 分組交換技術3.1 理論介紹3.2 Python實現及代碼詳解3.3 案例分析 4. 報文交換技術4.1 …

[Python] 操作redis使用pipeline保證原子性

1. pipeline介紹 在Python中使用Redis的Pipeline可以使多個Redis命令在一個請求中批量執行&#xff0c;從而提高效率。redis-py庫提供了對Redis Pipeline的支持&#xff0c;下面是一個基本的例子&#xff1a; 首先&#xff0c;確保你已安裝了redis庫&#xff1a; pip instal…

Bug 解決 無法正常登錄或獲取不到用戶信息

目錄 1、跨域問題 2、后端代碼問題 3、前端代碼問題 我相信登錄這個功能是很多人做項目時候遇到第一個檻&#xff01; **看起來好像很簡單的登錄功能&#xff0c;實際上還是有點坑的&#xff0c;比如明明賬號密碼都填寫正確了&#xff0c;**為什么登錄后請求接口又說我沒登…

論文翻譯 | ChunkRAG: Novel LLM-Chunk Filtering Method for RAG Systems

摘要 使用大型語言模型&#xff08;LLM&#xff09;的檢索-增強生成&#xff08;RAG&#xff09;系統經常由于檢索不相關或松散相關的信息而生成不準確的響應。現有的在文檔級別操作的方法無法有效地過濾掉此類內容。我們提出了LLM驅動的塊過濾&#xff0c;ChunkRAG&#xff0…

Maven(生命周期、POM、模塊化、聚合、依賴管理)詳解

Maven構建項目的生命周期 在Maven出現之前&#xff0c;項目構建的生命周期就已經存在&#xff0c;軟件開發人員每天都在對項目進行清理&#xff0c;編譯&#xff0c;測試&#xff0c;部署等工作&#xff0c;這個過程就是項目構建的生命周期。雖然大家都在不停的做構建工作&…

jenkins harbor安裝

Harbor是一個企業級Docker鏡像倉庫?。 文章目錄 1. 什么是Docker私有倉庫2. Docker有哪些私有倉庫3. Harbor簡介4. Harbor安裝 1. 什么是Docker私有倉庫 Docker私有倉庫是用于存儲和管理Docker鏡像的私有存儲庫。Docker默認會有一個公共的倉庫Docker Hub&#xff0c;而與Dock…

【Python網絡爬蟲筆記】10- os庫存儲爬取數據

os庫的作用 操作系統交互&#xff1a;os庫提供了一種使用Python與操作系統進行交互的方式。使用os庫來創建用于存儲爬取數據的文件夾&#xff0c;或者獲取當前工作目錄的路徑&#xff0c;以便將爬取的數據存儲在合適的位置。環境變量操作&#xff1a;可以讀取和設置環境變量。在…

微信小程序從后端獲取的圖片,展示的時候上下沒有完全拼接,有縫隙【已解決】

文章目錄 1、index.wxml2、index.js3、detail.detail為什么 .rich-text-style 樣式可以生效&#xff1f;1. <rich-text> 組件的特殊性2. 類選擇器的作用范圍3. 樣式優先級4. line-height: 0 的作用5. 為什么直接使用 rich-text 選擇器無效&#xff1f; 總結 上下兩張圖片…

Linux-apache虛擬主機配置筆記

一、 安裝apache 有需要的話&#xff0c;可以去查看具體的apache的安裝apache安裝https://blog.csdn.net/m0_68472908/article/details/139348739?spm1001.2014.3001.5501 都可以使用本地yum源搭建本地yum源搭建https://blog.csdn.net/m0_68472908/article/details/14385692…

常用vim命令行-linux008

Vim 是一款功能強大的文本編輯器&#xff0c;廣泛應用于編程、配置文件編輯以及日常文本處理。Vim 在其命令行模式下提供了豐富的操作命令&#xff0c;這些命令能夠大幅提升編輯效率。以下是 Vim 中常用的命令及操作的總結&#xff0c;覆蓋了 Vim 中的基本操作、查找、替換、文…