C#中async await異步關鍵字用法和異步的底層原理

目錄

  • C#異步編程
    • 一、異步編程基礎
    • 二、異步方法的工作原理
    • 三、代碼示例
    • 四、編譯后的底層實現
    • 五、總結

C#異步編程

一、異步編程基礎

  1. 異步編程是啥玩意兒
    • 就是讓程序在干等著某些耗時操作(比如等網絡響應、讀寫文件啥的)的時候,能把線程騰出來干別的活兒,這樣程序就能更靈敏、更高效啦。
    • 跟同步編程不一樣,同步編程就是老老實實等著操作完成才繼續往下走,線程就一直被占著,多浪費啊。
  2. 異步編程的好處
    • 響應快:比如在做UI界面的時候,用了異步編程,界面就不會卡啦,用戶體驗賊棒。
    • 省資源:不用讓線程一直干等著,資源利用率就上去了。
    • 能扛更多活兒:面對一大堆并發操作的時候,異步編程能輕松搞定,擴展性杠杠滴。

二、異步方法的工作原理

  1. 異步方法咋被編譯的
    • 你寫個async修飾的方法,編譯器就把它變成一個狀態機啦。
    • 狀態機會根據await表達式把方法拆成好多個狀態,就跟玩拼圖一樣。
  2. 狀態機是咋干活的
    • 狀態機就是編譯器生成的一個類,它得記著異步方法執行到哪兒了。
    • 核心就是MoveNext方法,它就像導演一樣,指揮著異步操作一步步往下走。
    • 每碰到一個await,就切換一下狀態。
  3. await底層是咋實現的
    • await就整出個等待器(awaiter),專門等著異步操作完成。
    • 要是操作還沒完,await就記下當前狀態,等操作完了再繼續往下走。

三、代碼示例

  1. HttpClient干異步網絡請求
    • 弄個HttpClient對象,用來發HTTP請求。
    • GetStringAsync方法,就能異步拿到指定URL的網頁內容啦。
    • 把拿到的內容打印出來,瞧一瞧成果。
using System;
using System.Net.Http;
using System.Threading.Tasks;namespace asyncawait原理1
{class Program{static async Task Main(string[] args){using (HttpClient httpClient = new HttpClient()){string html = await httpClient.GetStringAsync("https://www.baidu.com");Console.WriteLine(html);}}}
}
  1. 異步讀寫文件
    • File.WriteAllTextAsync方法,能把文本異步寫到指定路徑的文件里。
    • File.ReadAllTextAsync方法,就能把文件內容異步讀出來。
    • 把讀到的內容打印出來,看看對不對。
using System;
using System.IO;
using System.Threading.Tasks;namespace asyncawait原理1
{class Program{static async Task Main(string[] args){string txt = "hello world";string filename = @"E:\temp\1.txt";await File.WriteAllTextAsync(filename, txt);Console.WriteLine("寫入成功");string s = await File.ReadAllTextAsync(filename);Console.WriteLine("文件內容:" + s);}}
}

四、編譯后的底層實現

  1. 用ILSpy反編譯DLL文件
    • ILSpy就是個反編譯工具,能把DLL文件變回C#代碼,方便咱們研究。
    • 把DLL文件加載到ILSpy里,就能看到編譯后的代碼啦。
[CompilerGenerated]
private sealed class <>c__DisplayClass0_0 : IAsyncStateMachine
{public int <>1__state;public AsyncTaskMethodBuilder <>t__builder;public string[] args;private string <>s__1;private string <>s__3;private string <>s__6;private HttpClient <httpClient>__4;private string <html>__5;private string <txt>__2;private string <filename>__7;private void MoveNext(){int num = this.<>1__state;try{TaskAwaiter<string> awaiter;TaskAwaiter awaiter2;switch (num){default:this.<httpClient>__4 = new HttpClient();goto case 0;case 0:try{awaiter = this.<httpClient>__4.GetStringAsync("https://www.baidu.com").GetAwaiter();if (!awaiter.IsCompleted){num = this.<>1__state = 0;this.<>t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref this);return;}}catch (Exception exception){this.<>1__state = -2;this.<>t__builder.SetException(exception);return;}this.<html>__5 = awaiter.GetResult();Console.WriteLine(this.<html>__5);this.<txt>__2 = "hello yz";this.<filename>__7 = @"E:\temp\1.txt";awaiter2 = File.WriteAllTextAsync(this.<filename>__7, this.<txt>__2).GetAwaiter();if (!awaiter2.IsCompleted){num = this.<>1__state = 1;this.<>t__builder.AwaitUnsafeOnCompleted(ref awaiter2, ref this);return;}break;case 1:awaiter2 = this.<>s__1;this.<>s__1 = null;num = this.<>1__state = -1;break;}awaiter2.GetResult();Console.WriteLine("寫入成功");this.<>s__3 = null;awaiter = File.ReadAllTextAsync(this.<filename>__7).GetAwaiter();if (!awaiter.IsCompleted){num = this.<>1__state = 2;this.<>t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref this);return;}this.<>s__6 = awaiter.GetResult();Console.WriteLine("文件內容:" + this.<>s__6);this.<>s__6 = null;this.<>t__builder.SetResult();}catch (Exception exception){this.<>1__state = -2;this.<>t__builder.SetException(exception);return;}this.<>1__state = -1;}void IAsyncStateMachine.MoveNext(){// This method is implemented by the compiler-generated code.}[DebuggerHidden]private void SetStateMachine(IAsyncStateMachine stateMachine){this.<>t__builder.SetStateMachine(stateMachine);}void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine){this.SetStateMachine(stateMachine);}
}
  1. 看看編譯后的狀態機代碼
    • 分析狀態機類的結構,看看都有啥變量、MoveNext方法長啥樣。
    • 瞧瞧awaiter咋用的,狀態咋切換的。
  2. 理解MoveNext方法是干啥的
    • MoveNext就是狀態機的發動機,它決定了異步方法咋執行。
    • 在這個方法里,會根據當前狀態執行對應的代碼,碰到await就暫停,安排好后續咋繼續。

五、總結

  1. 異步方法編譯過程回顧
    • 再嘮嘮async方法咋被編譯成狀態機的,狀態機又咋根據await拆分方法、驅動異步操作的。
  2. await到底在干啥
    • 說白了,await根本不是真的“等待”,而是靠狀態機和等待器來實現的異步協作。
    • 強調一下異步編程的好處,比如響應快、省資源、能扛更多活兒,還有啥場景適合用它。

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

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

相關文章

安全教育知識競賽答題小程序怎么做

以下是制作安全教育知識競賽答題小程序的一般步驟&#xff1a; 一、準備階段 注冊小程序賬號&#xff1a;前往微信公眾平臺&#xff0c;注冊一個小程序賬號&#xff0c;主體類型可根據實際情況選擇個人或企業等&#xff0c;注冊成功后登錄獲取appid。 下載安裝開發工具&#x…

記錄待辦事項的便簽軟件有沒有推薦的?

在快節奏的現代生活中&#xff0c;我們每天都要處理大量的工作任務和生活瑣事&#xff0c;稍有不慎就可能遺漏重要事項。你是否經常遇到這樣的情況&#xff1a;明明記得有件事要做&#xff0c;卻怎么也想不起來是什么&#xff1b;或者手頭同時有好幾項任務&#xff0c;卻不知道…

實驗四 中斷實驗

一、實驗目的 掌握中斷服務程序的編寫。 二、實驗電路 三、實驗內容 1&#xff0e;實驗用PC機內部的中斷控制器8259A&#xff0c;中斷源用TPC-ZK實驗箱上的單脈沖電路&#xff0c;將單脈沖電路的輸出接中斷請求信號IRQ&#xff0c;每按一次單脈沖按鍵產生一次…

React 項目src文件結構

SCSS 組件庫 SCSS為預處理器 支持除原生CSS外的其他語句 別名路徑 在項目下的第一級目錄就加入craco.config.js文件并且修改packpage.js 中的部分 // 擴展webpage的配置const path require(path)module.exports {// exports配置webpack:{// 配置別名alias:{:path.resolve(__d…

Cursor入門教程-JetBrains過度向

Cursor使用筆記 **前置&#xff1a;**之前博主使用的是JetBrains的IDE&#xff0c;VSCode使用比較少&#xff0c;所以會盡量朝著JetBrains的使用習慣及樣式去調整。 一、設置語言為中文 如果剛上手Cursor&#xff0c;那么肯定對Cursor中的眾多選項配置項不熟悉&#xff0c;這…

Linux上位機開發實踐(SoC和MCU的差異)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 soc一般是指跑linux的芯片&#xff0c;而mcu默認是跑rtos的芯片&#xff0c;兩者在基本原理方面其實差異不大。只不過&#xff0c;前者由于性能的原…

離線導出和安裝Python庫

詳細介紹&#xff1a;離線導出和安裝Python庫 常用命令&#xff1a; 生成requirement.txt文件 pip freeze > requirement.txt離線批量下載庫 pip download -d packages -r requirement.txt離線批量安裝庫 pip install --no-index --find-links./ -r requirement.txt

基于Vue Node.js的電影售票網站的設計與實現(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 互聯網技術的成熟和普及&#xff0c;勢必會給人們的生活方式帶來不同程度的改變。越來越多的經營模式中都少不了線上運營&#xff0c;互聯網正強力推動著社會和經濟發展。國人對民族文化的自信和不同文化的包容&#xff0c;再加上電影行業的發展&#xff0c;如此繁榮吸引…

利用 Python 和 AI 技術創作獨特的圖像藝術作品

1. 項目目標 生成藝術作品&#xff1a;利用 AI 模型&#xff08;如 Stable Diffusion&#xff09;生成具有藝術風格的圖像。自定義風格&#xff1a;通過文本提示&#xff08;prompt&#xff09;控制圖像的藝術風格&#xff08;如賽博朋克、印象派、超現實主義等&#xff09;。…

XR技術賦能藝術展演|我的宇宙推動東方美學體驗化

本次廣州展覽現場引入我的宇宙XR體驗模塊&#xff0c;通過空間計算與動作捕捉技術&#xff0c;讓觀眾在潮玩藝術氛圍中體驗虛擬互動&#xff0c;打造“看得懂也玩得動”的展演新場景。 作為科技與文化融合的推動者&#xff0c;我的宇宙正在以“體驗科技”為媒介&#xff0c;為潮…

接口的集成測試步驟

一、集成測試是什么 ?接口的集成測試?是指在軟件開發過程中&#xff0c;將各個模塊或組件按照設計要求組合在一起&#xff0c;并測試它們之間的接口是否能夠正確交互和協同工作的過程。集成測試是軟件開發中的一個重要階段&#xff0c;通常在單元測試之后進行&#xff0c;目的…

上門服務 APP 30 億營收商業模式在烏干達的技術賦能與實踐

不久前&#xff0c;非洲烏干達出現黑人女技師提供上門足療服務的消息引發關注。據了解&#xff0c;當地一次40分鐘的上門按摩服務僅需約40元人民幣&#xff0c;價格僅為國內同類服務的十分之一。這一現象折射出全球健康服務行業正在經歷的數字化轉型浪潮。 國內領先的上門服務平…

go語言學習筆記:gin + gorm + mysql 用戶增刪改查案例入門

大家好&#xff0c;我是此林。 Golang 語言現在已經成為了編程的趨勢&#xff0c;畢竟是大廠背書嘛&#xff0c;Google 研發的。 目前很多云原生項目都是基于 go 來編寫的&#xff0c;比如&#xff1a; Kubernetes (K8s)? 容器編排系統&#xff0c; Docker? 容器化技術&…

探索亮數據Web Unlocker API:讓谷歌學術網頁科研數據 “觸手可及”

本文目錄 一、引言二、Web Unlocker API 功能亮點三、Web Unlocker API 實戰1.配置網頁解鎖器2.定位相關數據3.編寫代碼 四、Web Scraper API技術亮點 五、SERP API技術亮點 六、總結 一、引言 網頁數據宛如一座蘊藏著無限價值的寶庫&#xff0c;無論是企業洞察市場動態、制定…

SpringBoot整合POI實現Excel文件的導出與導入

使用 Apache POI 操作 Excel文件,系列文章: 《SpringBoot整合POI實現Excel文件的導出與導入》 《SpringMVC實現文件的上傳與下載》 《C#使用NPOI導出Excel文件》 《NPOI使用手冊》 1、Apache POI 的介紹 Apache POI 是一個基于 Java 的開源庫,專為讀寫 Microsoft Office 格…

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐

構建用戶友好的記賬體驗 - LedgerX交互設計與性能優化實踐 發布日期: 2025-04-16 引言 在財務管理應用領域&#xff0c;技術實力固然重要&#xff0c;但最終決定用戶留存的往往是日常使用體驗。本文作為LedgerX技術博客的第二篇&#xff0c;將深入探討我們如何通過精心的交互…

如何用AI輔助軟件產品原型設計及工具推薦

以下是針對軟件產品原型設計的 AI輔助工具推薦&#xff0c;涵蓋國內外主流工具&#xff0c;結合功能特點、優劣勢及適用場景分析&#xff0c;并標注是否為國內軟件及付費情況&#xff1a; 一、國內工具推薦 1. 墨刀AI&#xff08;MockingBot AI&#xff09; 特點&#xff1a;…

MySQL的MVCC機制詳解

1. 什么是MVCC&#xff1f; MVCC&#xff08;Multi-Version Concurrency Control&#xff0c;多版本并發控制&#xff09;是數據庫系統中用于實現并發控制的一種技術。它通過保存數據在某個時間點的快照來實現&#xff0c;使得在同一個數據行上可以同時存在多個版本&#xff0…

C語言數字圖像處理---2.31統計濾波器

本文介紹空域濾波器中的一種:統計濾波器 [定義與算法] 統計濾波(Statistic Filter)定義:基于圖像處理中的鄰域統計方法,對鄰域內的像素信息進行統計,如基于均值和方差的信息,用于平滑或去噪圖像,同時保留邊緣信息。 算法步驟如下: 統計濾波器的優點和缺點主要包…

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界?

計算機視覺相機模型與標定:如何讓計算機“看懂”三維世界? 一、前言二、相機模型基礎?2.1 針孔相機模型?2.1.1 模型原理?2.1.2 代碼示例?2.2 透視變換與相機內參?2.2.1 透視變換矩陣?2.2.2 內參矩陣的作用?2.3 相機外參?2.3.1 世界坐標系與相機坐標系的轉換?2.3.2 外…