如何在 .NET Core 中輕松實現異步編程并提升性能

目錄

初識異步編程

與多線程關系

異步編程操作


初識異步編程

????????異步編程:是指在執行某些任務時程序可以在等待某個操作完成的過程中繼續執行其他任務,而不是阻塞當前線程,這在處理I/O密集型操作(如文件讀取、數據庫查詢、網絡請求等)時尤為重要,能夠顯著提高應用程序的性能和響應能力。

在.net core中異步編程主要通過asyncawait關鍵字來實現,結合Task類進行異步操作的管理:

async:標記方法為異步方法使其能夠包含await表達式

await:在異步方法中用于等待一個異步操作完成,允許方法在等待期間繼續執行其他代碼而不會阻塞線程

異步方法通常返回TaskTask<T> 類型:

Task:表示一個沒有返回值的異步操作

Task<T>:表示一個帶返回值的異步操作,其中T是返回值的類型

??????? 作用意義:在進行項目開發的時候通常都會遇到異步編程的使用方式,具備的意義如下:

1)提高應用程序響應性:異步編程可以使得應用程序在等待長時間操作(例如網絡請求或文件讀寫)時繼續處理其他任務而不會卡住主線程,比如在桌面應用或Web應用中用戶界面不會因等待數據加載而變得無響應

2)提升性能:傳統的同步編程會阻塞線程直到操作完成,這可能導致線程資源的浪費,特別是在高并發場景下異步編程允許線程釋放去處理其他任務,避免了線程饑餓問題,最大化利用CPU資源特別是在I/O密集型操作時

3)節省資源:異步操作不需要為每個操作分配新的線程,因此能夠節省系統資源,在高并發情況下異步編程可以顯著減少上下文切換開銷

4)適用于I/O密集型應用:異步編程特別適用于那些需要大量I/O操作的應用,例如網絡請求、磁盤讀取、數據庫查詢等。通過異步操作可以避免長時間等待I/O操作而導致的性能瓶頸

接下來我們通過異步方法從指定的URL路徑上下載網頁內容,將網頁內容保存到本地文件并輸出下載的內容的字節數,代碼結果如下所示:

using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;namespace Program
{class Program{static async Task Main(string[] args){int len = await DownloadHtmlAsync("https://www.baidu.com", @"d:\test\1.txt");Console.WriteLine($"Downloaded {len} bytes.");}static async Task<int> DownloadHtmlAsync(string url, string filename){using (HttpClient client = new HttpClient()){string html = await client.GetStringAsync(url);await File.WriteAllTextAsync(filename, html);return html.Length;}}}
}

與多線程關系

異步編程并不等于多線程,這是兩個概念,異步方法的代碼并不會自動在新線程中執行,除非把代碼放到新線程中執行,以下做一個簡單的演示:

使用異步方法來執行長時間運行的計算,通過Thread.CurrentThread.ManagedThreadId輸出當前執行線程的ID,可以看到異步方法和線程調度的關系如下,這里我們通過計算5000*5000的情況避免執行太快:

using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;namespace Program
{class Program{static async Task Main(string[] args){Console.WriteLine("之前:" + Thread.CurrentThread.ManagedThreadId);double r = await CalcAsync(5000);Console.WriteLine("之后:" + Thread.CurrentThread.ManagedThreadId);}static async Task<double> CalcAsync(int n){Console.WriteLine("CalcAsync" + Thread.CurrentThread.ManagedThreadId);double result = 0;Random rand = new Random();for (int i = 1; i <= n*n; i++){result += rand.NextDouble();}return result;}}
}

那么如何在新的線程中執行異步方法呢?這里我們必須手動將異步方法放到新的線程中,這里我們只需要將要執行的代碼以委托的形式傳遞給Task.Run(),這樣就會從線程池中取出一個線程來執行我們的委托,如下可以看到我們的線程已經發送了變化:

如果一個異步方法只是對別的異步方法調用轉發,并沒有太多復雜的邏輯,那么就可以去掉異步關鍵字直接返回Task,如下所示:

對于多線程來講,在await調用的等待期間.net會把當前的線程返回給線程池,等異步方法調用執行完畢之后,框架會從線程池再取出一個線程執行后續代碼,怎么理解?比如說你進入一家餐館服務器給你遞上一個菜單,在等待你選菜的時候服務你的服務員可能會繼續服務別人,當你點餐完畢提交給服務員之后,服務你的服務員可能就不是剛剛服務你的人了,就是這么個意思,當然如果異步等待時間極短,線程可能就不會發送變化:

盡管異步編程和多線程都涉及到并發執行任務,但它們的工作原理和適用場景有所不同,可以把它們看作是兩個不同的工具用于解決不同類型的并發問題:

異步編程:通過非阻塞的方式執行操作,適用于 I/O 密集型任務,能夠節省線程資源提高應用的響應性。

多線程:通過并行執行任務來提高CPU密集型任務的性能,但線程管理復雜可能帶來上下文切換和同步問題。

異步編程與多線程的結合:異步編程通過減少阻塞來提高效率而多線程通過并行執行來加速計算密集型任務,在某些情況下它們可以結合使用:例如異步任務通過線程池線程執行,充分利用多核處理器的計算能力。

異步編程操作

異步等待:如果想在異步方法中暫停一段時間的話,這里可以使用 await Task.Delay()的方式,例如下載一個網址然后等待3秒再下載另一個,注意這里是不能使用Thread.Sleep()方法的,該方法是阻塞線程用的,異步編程并不適用,這里我們演示一下異步等待的效果,如下所示:

class Program
{static async Task Main(string[] args){var input = Console.ReadLine();Console.WriteLine(input);await Task.Delay(3000);Console.WriteLine(input+".net core");}
}

異步取消:在異步編程中CancellationToken是用于取消異步操作的一種機制,它提供了一種優雅的方式來中止正在進行的操作,當用戶操作可能會長時間運行時,例如下載文件、訪問數據庫、調用遠程API等,CancellationToken用于支持任務的取消操作,示例如下:

class Program
{static async Task Main(string[] args){CancellationTokenSource cts = new CancellationTokenSource();cts.CancelAfter(3000);CancellationToken cToken = cts.Token;await Download1Async("https://www.baidu.com", 100, cToken);}static async Task Download1Async(string url, int n, CancellationToken token){using(HttpClient client = new HttpClient()){for (int i = 0; i < n; i++){string html = await new HttpClient().GetStringAsync(url);Console.WriteLine($"{DateTime.Now}:{html}");if (token.IsCancellationRequested){Console.WriteLine("超時任務取消");break;}}}}
} 

當我們打印數據的時候,請求超過5秒還沒有結束的話我們就手動取消異步操作:

Task類方法:在Task類中有許多方法可以使用,以下是其常用的方法講解:

1)Task.WhenAny():任何一個Task完成,Task就完成

2)Task.WhenAll():所有Task完成Task才完成,用于等待多個任務執行結束不在乎順序

3)Task.FromResult():創建普通數值的Task對象

如下我們可同WhenAll拿到所有文件的數據:

class Program
{static async Task Main(string[] args){Task<string> t1 = File.ReadAllTextAsync(@"d:\test\1.txt");Task<string> t2 = File.ReadAllTextAsync(@"d:\test\2.txt");Task<string> t3 = File.ReadAllTextAsync(@"d:\test\3.txt");string[] result = await Task.WhenAll(t1, t2, t3);} 
} 

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

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

相關文章

麒麟操作系統服務架構保姆級教程(二)ssh遠程連接

如果你想擁有你從未擁有過的東西&#xff0c;那么你必須去做你從未做過的事情 作為一名成熟運維架構師&#xff0c;我們需要管理的服務器會達到幾十臺&#xff0c;上百臺&#xff0c;上千臺&#xff0c;甚至是上萬臺服務器&#xff0c;而且咱們的服務器還不一定都在一個機房&am…

159.等差數列的劃分

class Solution {public int numberOfArithmeticSlices(int[] nums) {int lenums.length;if(le<3){return 0;}int arith0,res0,count0;//arith是差的大小,res是結果,count計算等差數量for(int i1;i<le;i){if(nums[i]-nums[i-1]arith){count;if(count>2){rescount-1;}}…

RabbitMQ消息隊列的筆記

Rabbit與Java相結合 引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 在配置文件中編寫關于rabbitmq的配置 rabbitmq:host: 192.168.190.132 /…

請求三方http工具

請求三方接口工具封裝 實現邏輯&#xff1a; 發起請求&#xff0c;輸入基本請求信息&#xff1a;請求地址&#xff0c;請求類型&#xff0c;請求參數&#xff0c;是否需要認證工具自動為需要添加認證的請求添加認證&#xff0c;如果發現token快要過期或返回的錯誤編碼為定義的…

HP服務器開啟性能模式

ENERGY PERF BIAS CFG 模式指的是通過特定配置(通常是 BIOS 或操作系統中的設置)來控制處理器的能源性能偏置(Energy Performance Bias, EPB)。EPB 是一種機制,允許用戶或系統管理員在性能和功耗之間進行權衡。不同的設置可以影響系統的響應速度、能效等。 ENERGY PERF B…

調用釘釘接口發送消息

調用釘釘接口發送消息 通過創建釘釘開放平臺創建H5小程序&#xff0c;通過該小程序可以實現向企業內的釘釘用戶發送消息&#xff08;消息是以工作通知的形式發送&#xff09; 1、目前僅支持發送文本消息&#xff0c;相同內容的文本只能成功發送一次&#xff0c;但是接口返回發…

純css 實現呼吸燈效果

開始效果 呼吸效果 實現代碼 <div class"container"><div class"breathing-light"></div> </div><style>html,body {height: 100%;background-color: white;}.container {padding: 100px;}.container .breathing-light {wi…

進程通信方式---共享映射區(無血緣關系用的)

5.共享映射區&#xff08;無血緣關系用的&#xff09; 文章目錄 5.共享映射區&#xff08;無血緣關系用的&#xff09;1.概述2.mmap&&munmap函數3.mmap注意事項4.mmap實現進程通信父子進程練習 無血緣關系 5.mmap匿名映射區 1.概述 原理&#xff1a;共享映射區是將文件…

《云原生安全攻防》-- K8s安全框架:認證、鑒權與準入控制

從本節課程開始&#xff0c;我們將來介紹K8s安全框架&#xff0c;這是保障K8s集群安全比較關鍵的安全機制。接下來&#xff0c;讓我們一起來探索K8s安全框架的運行機制。 在這個課程中&#xff0c;我們將學習以下內容&#xff1a; K8s安全框架&#xff1a;由認證、鑒權和準入控…

day08-別名-重定向-去重排序等

1.重復用touch命令創建同一份文件&#xff0c;會修改文件的時間戳。 alias命令&#xff1a; 別名 查看已有別名&#xff1a;alias [rootoldboy ~]# alias alias cpcp -i alias egrepegrep --colorauto alias fgrepfgrep --colorauto alias grepgrep --colorauto alias l.ls…

Qt WORD/PDF(四)使用 QAxObject 對 Word 替換(QWidget)

關于QT Widget 其它文章請點擊這里: QT Widget 國際站點 GitHub: https://github.com/chenchuhan 國內站點 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium庫實現 PDF 操作 Qt WORD/PDF&#xff08;二…

設計一個基礎JWT的多開發語言分布式電商系統

在設計一個分布式電商系統時&#xff0c;保證系統的可擴展性、性能以及跨語言的兼容性是至關重要的。隨著微服務架構的流行&#xff0c;越來越多的電商系統需要在多個服務間共享信息&#xff0c;并且保證服務的安全性。在這樣的場景下&#xff0c;JSON Web Token&#xff08;JW…

實踐分享 | 公共數據金融應用的理論探索與實踐研究—以人民幣銀行結算賬戶數據應用為例

摘要:公共數據具有高權威性、高準確性、高價值性以及高應用性的特點,實現公共數據的金融應用對更好服務實體經濟、防控金融風險和提升金融服務水平具有重要現實意義。本文從理論探索與實踐研究兩個層面分析了公共數據金融應用的具體問題,一方面探索性的給出了公共數據金融應…

Node的學習以及學習通過Node書寫接口并簡單操作數據庫

Node的學習 Node的基礎上述是關于Node的一些基礎&#xff0c;總結的還行&#xff1b; 利用Node書寫接口并操作數據庫 1. 初始化項目 創建新的項目文件夾&#xff0c;并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安裝必要的依賴 安裝Express.js&…

計算機視覺中的特征提取算法

摘要&#xff1a; 本文聚焦于計算機視覺中的特征提取算法&#xff0c;深入探討尺度不變特征變換&#xff08;SIFT&#xff09;算法。詳細闡述 SIFT 算法的原理&#xff0c;包括尺度空間構建、關鍵點檢測、方向分配與特征描述子生成等核心步驟。通過 C#、Python 和 C 三種編程語…

MySQL 主從復制與 Binlog 深度解析

目錄 1. Binlog的工作原理與配置2. 主從復制的設置與故障排除3. 數據一致性與同步延遲的處理 小結 MySQL的binlog&#xff08;二進制日志&#xff09;和主從復制是實現數據備份、容災、負載均衡以及數據同步的重要機制。在高可用性架構和分布式數據庫設計中&#xff0c;binlog同…

排隊論、負載均衡和任務調度關系

目錄 排隊論、負載均衡和任務調度關系 一、排隊論 二、負載均衡 三、任務調度 四、總結 排隊論、負載均衡和任務調度關系 排隊論為負載均衡和任務調度提供了數學理論和方法支持 排隊論、負載均衡和任務調度是三個相關但不同的概念。以下是對這三個概念的詳細解釋和它們之…

java版詢價采購系統 招投標詢價競標投標系統 招投標公告系統源碼

功能描述 1、門戶管理&#xff1a;所有用戶可在門戶頁面查看所有的公告信息及相關的通知信息。主要板塊包含&#xff1a;招標公告、非招標公告、系統通知、政策法規。 2、立項管理&#xff1a;企業用戶可對需要采購的項目進行立項申請&#xff0c;并提交審批&#xff0c;查看所…

景聯文科技入選中國信通院發布的“人工智能數據標注產業圖譜”

近日&#xff0c;由中國信息通信研究院、中國人工智能產業發展聯盟牽頭&#xff0c;聯合中國電信集團、沈陽市數據局、保定高新區等70多家單位編制完成并發布《人工智能數據標注產業圖譜》。景聯文科技作為人工智能產業關鍵環節的代表企業&#xff0c;入選圖譜中技術服務板塊。…

【小沐學GIS】基于C++繪制三維數字地球Earth(OpenGL、glfw、glut、QT)第三期

&#x1f37a;三維數字地球系列相關文章如下&#x1f37a;&#xff1a;1【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐學GIS】基于C繪制三維數字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…