【C#語言】C#同步與異步編程深度解析:讓程序學會“一心多用“

文章目錄

  • ?前言
  • ?一、同步編程:單線程的線性世界
    • 🌟1、尋找合適的對象
      • ?1)
    • 🌟7、設計應支持變化
  • ?二、異步編程:多任務的協奏曲
  • ?三、async/await工作原理揭秘
  • ?四、最佳實踐與性能陷阱
  • ?五、異步編程適用場景
  • ?六、性能對比實測
  • ?七、異步編程的哲學思考
  • ?總結


標題詳情
作者JosieBook
頭銜CSDN博客專家資格、阿里云社區專家博主、軟件設計工程師
博客內容開源、框架、軟件工程、全棧(,NET/Java/Python/C++)、數據庫、操作系統、大數據、人工智能、工控、網絡、程序人生
口號成為你自己,做你想做的
歡迎三連👍點贊、?評論、?收藏

?前言

在現代軟件開發中,處理高并發、優化響應速度是每個開發者必須面對的挑戰。C#的異步編程模型為我們提供了一把解決這些問題的金鑰匙。本文將深入解析同步與異步的本質區別,并通過實際案例演示如何正確使用async/await構建高效應用。

?一、同步編程:單線程的線性世界

同步代碼示例:

void MakeBreakfast()
{Coffee cup = PourCoffee();Console.WriteLine("咖啡好了");Egg eggs = FryEggs(2);Console.WriteLine("雞蛋好了");Bacon bacon = FryBacon(3);Console.WriteLine("培根好了");Toast toast = ToastBread(2);ApplyButter(toast);ApplyJam(toast);Console.WriteLine("吐司好了");
}

在這個典型的同步示例中:

  • 每個操作必須等待前一個完成

  • 主線程被完全阻塞

  • 總耗時 = 所有操作耗時之和

  • 資源利用率低下

🌟1、尋找合適的對象

?1)

🌟7、設計應支持變化

?二、異步編程:多任務的協奏曲

異步代碼示例:

async Task MakeBreakfastAsync()
{Task<Coffee> pourCoffeeTask = PourCoffeeAsync();Task<Egg> fryEggsTask = FryEggsAsync(2);Task<Bacon> fryBaconTask = FryBaconAsync(3);Task<Toast> toastTask = ToastBreadAsync(2);Coffee cup = await pourCoffeeTask;Console.WriteLine("咖啡好了");await Task.WhenAll(fryEggsTask, fryBaconTask);Console.WriteLine("雞蛋和培根好了");Toast toast = await toastTask;ApplyButter(toast);ApplyJam(toast);Console.WriteLine("吐司好了");
}

關鍵改進點:

  • 并行啟動多個任務

  • 使用await非阻塞等待

  • 總耗時 ≈ 最耗時任務的耗時

  • 資源利用率最大化

?三、async/await工作原理揭秘

async-await流程

  • 狀態機魔法:編譯器將async方法轉換為狀態機

  • 上下文保存:遇到await時保存當前上下文

  • 線程釋放:返回控制權給調用者

  • 恢復執行:任務完成后在原始上下文恢復

?四、最佳實踐與性能陷阱

推薦做法:

// 正確使用ConfigureAwait
async Task LoadDataAsync()
{var data = await GetDataFromNetworkAsync().ConfigureAwait(false);ProcessData(data); // 在任意線程上下文執行
}// 并行處理優化
async Task ProcessMultipleFilesAsync(IEnumerable<string> files)
{var tasks = files.Select(file => ProcessFileAsync(file));await Task.WhenAll(tasks);
}

需要避免的陷阱:

// 錯誤1:async void濫用
async void Button_Click(object sender, EventArgs e)
{// 異常無法被捕獲
}// 錯誤2:死鎖場景
var result = GetDataAsync().Result; // UI線程死鎖風險// 錯誤3:虛假異步
async Task<int> FakeAsync()
{Thread.Sleep(1000); // 阻塞調用return 42;
}

?五、異步編程適用場景

在這里插入圖片描述

?六、性能對比實測

測試代碼:

// 同步版本
void SyncDownload()
{for(int i=0; i<10; i++){var data = new WebClient().DownloadData(urls[i]);}
}// 異步版本
async Task AsyncDownload()
{var tasks = urls.Select(url => new HttpClient().GetByteArrayAsync(url));await Task.WhenAll(tasks);
}

在這里插入圖片描述

?七、異步編程的哲學思考

  • 資源觀:線程是寶貴資源,異步是節約線程的藝術

  • 響應式設計:保持UI流暢的核心解決方案

  • 并發模型:不同于多線程的協作式多任務

  • 架構影響:從底層到頂層的異步化改造

?總結

掌握異步編程如同獲得程序世界的"分身術",但要真正發揮其威力,需要深入理解其工作原理,并遵循最佳實踐。記住:

  • 異步不等于多線程,但可以更好利用多線程

  • 不要為了異步而異步,識別真正受益場景

  • 異步代碼需要配套的異常處理和取消機制

  • 逐步改造現有代碼,保持兼容性


標題詳情
作者JosieBook
頭銜CSDN博客專家資格、阿里云社區專家博主、軟件設計工程師
博客內容開源、框架、軟件工程、全棧(,NET/Java/Python/C++)、數據庫、操作系統、大數據、人工智能、工控、網絡、程序人生
口號成為你自己,做你想做的
歡迎三連👍點贊、?評論、?收藏

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

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

相關文章

Redis命令詳解--集合

Redis set 是string類型的無序集合。集合成員是唯一的&#xff0c;這就意味著集合中不能出現重復的數據&#xff0c;常用命令&#xff1a; SADD key member1 [member2...] 向集合添加一個或多個成員 SREM key member1 [member2...] 移除集合中一個或多個成員 SMEMBERS key 獲…

學習筆記 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件將 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改為 app.UseSwagger(); app.UseSwaggerUI(); 二.安裝ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

配置 VSCode 的 C# 開發環境

1. 安裝必要的依賴 1.1 VSCode 擴展 安裝 C# 相關插件&#xff08;如 C#、C# Extensions 等&#xff09;。 1.2 .NET SDK 下載地址&#xff1a;.NET SDK 下載頁面 1.3 安裝檢測 在命令行輸入以下命令&#xff0c;如果正確返回了版本號&#xff0c;則表示 .NET SDK 安裝成…

從零搭建微服務項目Pro(第6-1章——Spring Security+JWT實現用戶鑒權訪問與token刷新)

前言&#xff1a; 在現代的微服務架構中&#xff0c;用戶鑒權和訪問控制是非常重要的一部分。Spring Security 是 Spring 生態中用于處理安全性的強大框架&#xff0c;而 JWT&#xff08;JSON Web Token&#xff09;則是一種輕量級的、自包含的令牌機制&#xff0c;廣泛用于分…

使用HAI來打通DeepSeek的任督二脈

一、什么是HAI HAI是一款專注于AI與科學計算領域的云服務產品&#xff0c;旨在為開發者、企業及科研人員提供高效、易用的算力支持與全棧解決方案。主要使用場景為&#xff1a; AI作畫&#xff0c;AI對話/寫作、AI開發/測試。 二、開通HAI 選擇CPU算力 16核32GB&#xff0c;這…

【保姆級】阿里云codeup配置Git的CI/CD步驟

以下是通過阿里云CodeUp的Git倉庫進行CI/CD配置的詳細步驟&#xff0c;涵蓋前端&#xff08;Vue 3&#xff09;和后端&#xff08;Spring Boot&#xff09;項目的自動化打包&#xff0c;并將前端打包結果嵌入到Nginx的Docker鏡像中&#xff0c;以及將后端打包的JAR文件拷貝至Do…

LINUX網絡編程API原型詳細解析

1. 網絡體系 1.1. 簡介 網絡采用分而治之的方法設計&#xff0c;將網絡的功能劃分為不同的模塊&#xff0c;以分層的形式有機組合在一起。 每層實現不同的功能&#xff0c;其內部實現方法對外部其他層次來說是透明的。每層向上層提供服務&#xff0c;同時使用下層提供…

藍橋杯 之 暴力回溯

文章目錄 數字接龍小u的最大連續移動次數問題迷宮 在藍橋杯中&#xff0c;十分喜歡考察對于網格的回溯的問題&#xff0c;對于這類的問題&#xff0c;常常會使用到這個DFS和BFS進行考察&#xff0c;不過無論怎么考察&#xff0c;都只是會在最基礎的模本的基礎上&#xff0c;根據…

微信小程序的業務域名配置(通過ingress網關的注解)

一、背景 微信小程序的業務域名配置&#xff08;通過kong網關的pre-function配置&#xff09;是依靠kong實現&#xff0c;本文將通過ingress網關實現。 而我們的服務是部署于阿里云K8S容器&#xff0c;當然內核與ingress無異。 找到k8s–>網絡–>路由 二、ingress注解 …

Python數據可視化工具:六西格瑪及其基礎工具概覽

在當今數據驅動的時代&#xff0c;數據分析和可視化工具成為了各行業優化流程、提升質量的關鍵手段。六西格瑪&#xff08;Six Sigma&#xff09;作為一種以數據為基礎、追求完美質量的管理理念&#xff0c;其實施依賴于一系列基礎工具的靈活運用。而Python&#xff0c;憑借其強…

集群環境下Redis 商品庫存系統設計

目錄 環境實現基本結構代碼業務代碼主體庫存管理模塊 后續問題高并發臨界值與樂觀鎖問題 完整代碼總結后話 環境 我們現在要做商品秒殺系統。功能很簡單&#xff0c;就是庫存刪減。用戶先下單減庫存&#xff0c;之后再進行扣款。 實現 基本結構代碼 那么我們先看下如何搭建…

Spring MVC響應數據

handler方法分析 /*** TODO: 一個controller的方法是控制層的一個處理器,我們稱為handler* TODO: handler需要使用RequestMapping/GetMapping系列,聲明路徑,在HandlerMapping中注冊,供DS查找!* TODO: handler作用總結:* 1.接收請求參數(param,json,pathVariable,共享域等…

基于圖像識別的醫學影像大數據診斷系統的設計與實現

標題:基于圖像識別的醫學影像大數據診斷系統的設計與實現 內容:1.摘要 隨著醫學影像技術的快速發展&#xff0c;醫學影像數據量呈爆炸式增長&#xff0c;傳統的人工診斷方式在處理海量數據時效率低下且容易出現誤差。本研究的目的是設計并實現一個基于圖像識別的醫學影像大數據…

Python散點圖(Scatter Plot):數據探索的“第一張圖表”

在數據可視化領域,散點圖是一種強大而靈活的工具,它能夠幫助我們直觀地理解和探索數據集中變量之間的關系。本文將深入探討散點圖的核心原理、應用場景以及如何使用Python進行高效繪制。 后續幾篇將介紹高級技巧、復雜應用場景。 Python散點圖(Scatter Plot):高階分析、散點…

【redis】在 Spring中操作 Redis

文章目錄 基礎設置依賴StringRedisTemplate庫的封裝 運行StringList刪庫 SetHashZset 基礎設置 依賴 需要選擇這個依賴 StringRedisTemplate // 后續 redis 測試的各種方法&#xff0c;都通過這個 Controller 提供的 http 接口來觸發 RestController public class MyC…

微服務》》Kubernetes (K8S) 集群 安裝

關閉交換空間 # 切換 超級管理員身份 # 查看交換空間 free -h # 關閉交換空間 swapoff -a避免開啟啟動交換空間 # 注釋swap開頭的行 vim /etc/fstab關閉防火墻 # 關閉防火墻 # 因為K8S 是集群形式存在的 至少三臺 一主二從 &#xff08;一個master 兩個node&#xff09…

HTTP和RPC的區別

RPC和 HTTP是兩種常見的通信方式&#xff0c;它們在設計目標、使用場景和技術實現上有顯著區別。以下是它們的詳細對比&#xff1a; 1. 定義與核心思想 特性RPCHTTPRemote Procedure Call遠程過程調用HyperText Transfer Protocol超文本傳輸協議定義一種協議或框架&#xff0…

MySQL 簡記

MySQL 簡記 mysql中的數據存儲的結構是B樹 其與B樹的相同點是&#xff0c;B樹一個節點也可以存放多條數據&#xff0c;并且從左到右依次增大&#xff1b;不同點是&#xff0c;B樹的葉子結點之間也能相互連接。那么實際上是采取利用空間換區時間的策略。 那么B樹的樹結構like…

十七、實戰開發 uni-app x 項目(仿京東)- 后端指南

前面我們已經用uniappx進行了前端實戰學習 一、實戰 開發uni-app x項目(仿京東)-規劃-CSDN博客 二、實戰 開發uni-app x項目(仿京東)-項目搭建-CSDN博客 三、實戰開發 uni-app x 項目(仿京東)- 技術選型-CSDN博客 四、實戰開發 uni-app x 項目(仿京東)- 頁面設計-C…

Infura 簡介

文章目錄 Infura 簡介Infura 的主要功能Infura 的替代方案&#xff08;類似服務&#xff09;AlchemyQuickNodeAnkrMoralisPocket Network 什么時候選擇 Infura&#xff1f; Infura 簡介 Infura 是一個 區塊鏈基礎設施即服務&#xff08;BaaS, Blockchain as a Service&#xf…