【C#語言】C#中的同步與異步編程:原理、示例與最佳實踐

文章目錄

  • ?前言
  • ?一、同步編程:簡單但低效的線性執行
    • 🌟代碼示例
    • 🌟執行流程示意圖
    • 🌟同步編程特點
  • ?二、異步編程:非阻塞的高效執行
    • 🌟代碼示例
    • 🌟執行流程示意圖
    • 🌟異步編程核心機制
    • 🌟適用場景
  • ?三、并行異步編程:最大化性能
    • 🌟代碼示例
    • 🌟執行流程示意圖
    • 🌟并行異步優勢
  • ?四、同步 vs 異步 vs 并行異步:對比總結
  • ?五、實際開發中的選擇建議
    • 🌟何時用同步?
    • 🌟何時用異步?
    • 🌟何時用并行異步?
  • ?總結


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

?前言

在現代軟件開發中,高效的資源利用和響應速度是衡量程序質量的重要指標。C# 作為一門支持多范式編程的語言,提供了強大的同步和異步編程模型。本文將通過代碼示例、示意圖和場景分析,帶你深入理解這兩種編程模式的差異及適用場景。

?一、同步編程:簡單但低效的線性執行

🌟代碼示例

using System;
using System.Threading;class Program
{static void Main(){Console.WriteLine("同步示例開始");DoTask1();    // 同步執行任務1(阻塞)DoTask2();    // 任務1完成后執行任務2(阻塞)Console.WriteLine("同步示例結束");}static void DoTask1(){Console.WriteLine("任務1開始");Thread.Sleep(2000); // 模擬耗時操作(阻塞當前線程)Console.WriteLine("任務1完成");}static void DoTask2(){Console.WriteLine("任務2開始");Thread.Sleep(1000);Console.WriteLine("任務2完成");}
}

🌟執行流程示意圖

時間軸(單位:ms):
0    1000    2000    3000
|-----|-----|-----|-----|
主線程:
[開始] --> [DoTask1 (2000ms阻塞)] --> [DoTask2 (1000ms阻塞)] --> [結束]
任務流程:|========任務1========||==任務2==|
總耗時:3000ms

在這里插入圖片描述

🌟同步編程特點

  • 順序執行:任務必須嚴格按代碼順序完成。

  • 線程阻塞:Thread.Sleep 或I/O操作會凍結當前線程。

  • 資源浪費:線程在等待時無法處理其他任務。

  • 適用場景:簡單腳本、快速原型開發或CPU密集型計算。

?二、異步編程:非阻塞的高效執行

🌟代碼示例

using System;
using System.Threading.Tasks;class Program
{static async Task Main() // C# 7.1+ 支持異步Main方法{Console.WriteLine("異步示例開始");await DoTask1Async(); // 異步等待任務1await DoTask2Async(); // 任務1完成后異步等待任務2Console.WriteLine("異步示例結束");}static async Task DoTask1Async(){Console.WriteLine("任務1開始");await Task.Delay(2000); // 非阻塞的異步等待Console.WriteLine("任務1完成");}static async Task DoTask2Async(){Console.WriteLine("任務2開始");await Task.Delay(1000);Console.WriteLine("任務2完成");}
}

🌟執行流程示意圖

時間軸(單位:ms):
0    1000    2000    3000
|-----|-----|-----|-----|
主線程:
[開始] --> [啟動DoTask1Async] --(釋放線程)--> [等待DoTask1完成] --> [啟動DoTask2Async] --(釋放線程)--> [等待DoTask2完成] --> [結束]
任務流程:|========任務1========||==任務2==|
總耗時:3000ms

在這里插入圖片描述

🌟異步編程核心機制

  • async/await 關鍵字

    • async 標記方法為異步,允許內部使用 await。

    • await 暫停當前方法,將控制權交回調用方,直到異步操作完成。

  • 狀態機:編譯器將異步方法轉換為狀態機,管理異步操作的暫停與恢復。

  • 線程池協作:I/O操作(如文件讀寫、網絡請求)通過操作系統回調通知完成,不占用線程資源。

🌟適用場景

  • UI應用程序:避免界面凍結(如WPF、WinForms)。

  • Web服務:高并發請求處理(如ASP.NET Core)。

  • 文件/網絡操作:減少等待時間。

?三、并行異步編程:最大化性能

🌟代碼示例

static async Task Main()
{Console.WriteLine("并行異步示例開始");var task1 = DoTask1Async(); // 立即啟動任務1var task2 = DoTask2Async(); // 立即啟動任務2await Task.WhenAll(task1, task2); // 并行等待所有任務Console.WriteLine("并行異步示例結束");
}

🌟執行流程示意圖

時間軸(單位:ms):
0    1000    2000    3000
|-----|-----|-----|-----|
主線程:
[開始] --> [同時啟動Task1和Task2] --> [等待所有任務完成] --------------------------> [結束]
任務流程:|========任務1========||==任務2==|
總耗時:2000ms(取決于最長任務)

在這里插入圖片描述

🌟并行異步優勢

  • 并發執行:多個任務同時啟動,充分利用系統資源。

  • 性能優化:總耗時由最慢的任務決定,而非所有任務耗時的總和。

  • 資源效率:適合處理大量獨立I/O操作(如批量API調用)。

?四、同步 vs 異步 vs 并行異步:對比總結

在這里插入圖片描述

?五、實際開發中的選擇建議

🌟何時用同步?

  • 任務簡單且無需并發。

  • 操作是CPU密集型(如圖像處理)。

🌟何時用異步?

  • 涉及I/O操作(數據庫、API調用)。

  • 需要保持UI響應性。

  • 單任務依賴外部資源。

🌟何時用并行異步?

  • 多個獨立任務可同時執行。

  • 需要優化吞吐量(如微服務架構)。

?總結

同步編程是代碼世界的“單行道”,簡單但容易擁堵;異步編程則是“立交橋”,通過智能調度提升效率;并行異步則像“多車道高速公路”,最大化資源利用率。理解它們的差異后,開發者可以根據具體場景靈活選擇,從而編寫出既高效又優雅的C#代碼。無論是構建響應式UI還是高并發服務,異步編程都是現代C#開發者必須掌握的核心技能。


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

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

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

相關文章

el-input 不可編輯,但是點擊的時候出現彈窗/或其他操作面板,并且帶可清除按鈕

1.focus“getFocus”鼠標聚焦的時候寫個方法,彈窗起來 getFocus(){ this.定義的彈窗狀態字段 true;} 2.點擊確定的時候,數值賦值到el-input的輸入框,彈窗取消(this.定義的彈段字端 false) 3.但是會有個問題就是el-input 不可點…

事件響應計劃:網絡彈性的關鍵

網絡安全事件響應計劃不僅僅是技術上的需要,更是企業的當務之急。在網絡威脅比以往任何時候都更加復雜和頻繁的時代,了解并做好準備應對這些事件可能會決定是恢復還是災難。 以下是簡要分析: 網絡安全事件不僅僅是技術故障;它們…

正則表達式詳解(regular expression)

💡 正則表達式(Regular Expression, regex)知識點總結 💡 正則表達式是一種用于匹配字符串的模式,廣泛用于搜索、替換、驗證等操作。 📌 正則表達式的主要作用 1?? 字符串匹配 🧐 檢查一個…

全球化2.0 | ZStack云計算系統工程師(ZCCE)國際認證培訓成功舉辦

近日,ZStack云計算系統工程師(ZCCE)國際認證培訓在上海成功舉辦。本次培訓采用 "線下 線上直播" 雙軌模式,同步開設中文與英文課程,吸引了來自中國、東南亞、獨聯體、北美、中東等多個國家和地區的近 90 名…

C++學習之nginx+fastDFS

目錄 1.知識點概述 2.fastcgi復習 3.文件上傳流程分析 4.文件下載流程和優化 5.在存儲節點上安裝nginx和fastdfs插件 6.mod-fdsf.com配置文件修改 7.解決nginx的worker無法啟動,拷貝配置文件操作 8.客戶 通過瀏覽器訪問存儲節點404問題 9.nginx服務器處理資…

【AIGC】Win10系統極速部署Docker+Ragflow+Dify

【AIGC】WIN10僅3步部署DockerRagflowDify 一、 Docker快速部署1.F2進入bios界面,按F7設置開啟VMX虛擬化技術。保存并退出。2.打開控制面板配置開啟服務3.到官網下載docker安裝包,一鍵安裝(全部默認勾選) 二、 RagFlow快速部署1.確…

token升級(考慮在分布式環境中布置token,結合session保證請求調用過程中token不會過期。)

思路: 首先,用戶的需求是確保使用同一個Token的外部調用都在一個Session中處理。 需要考慮Token與Session綁定、安全措施、Session管理、分布式處理等。 使用Redis作為Session存儲, 在Java中 通過Spring Data Redis或Lettuce庫實現。 2.生成…

新一代電子數據取證專家 | 蘇州龍信信息科技有限公司

本文關鍵詞:電子取證、手機取證、計算機取證、云取證 關于我們About us 蘇州龍信信息科技有限公司專注于電子數據取證、大數據、信息安全等領域,核心業務主要涵蓋取證工具研發、大數據融合分析、案件技術支持、取證能力培訓等,先后為執法部門…

研究生研究方向系統基于springboot SSM

目錄 摘要 一、系統背景與目的 二、開發流程 三、系統架構與技術選型 四、功能分析 4.1 用戶角色與權限管理 4.2研究方向管理功能 4.3學習資源管理功能 4.4科研項目跟蹤功能 4.5學術交流與分享功能 4.6導師指導與評估功能 摘要 基于Spring Boot的研究生研究方向系統…

[解決] PDF轉圖片,中文亂碼或顯示方框的解決方案

在Java開發中,將PDF文件轉換為圖片是一項常見的需求,但過程中可能會遇到中文亂碼或顯示方框的問題。本文將深入探討這一問題,并提供詳細的解決方案,幫助開發者順利地完成PDF到圖片的轉換。 一、問題現象 在使用Java庫(如Apache PDFBox)將PDF轉換為圖片時,如果PDF文件中…

「JavaScript深入」WebSocket:高效的雙向實時通信技術

WebSocket WebSocket 的特點1. 全雙工通信2. 持久連接3. 低延遲4. 二進制和文本支持5. 連接管理6. 二進制數據傳輸 WebSocket 協議詳解1. 握手過程2. 數據幀結構 WebSocket 的實現服務器端實現(Node.js ws庫)1. 基礎服務器2. 廣播功能實現3. 心跳機制客…

ABAP 長文本編輯器

加個屏幕 *&---------------------------------------------------------------------* *& Report YDEMO2 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------…

postman小白教程(從入門到實戰,詳細教學)

目錄 1. postman介紹 2. 下載地址 3. 安裝流程 4. 注冊postman賬號 ① 打開postman,點擊【創建賬號】或【登錄】,會跳轉到瀏覽器 ② 若已有賬號可以直接登錄;若無賬號,則創建新賬號 ③ 若登錄成功會彈出提示框,…

Qt 實現波浪填充的圓形進度顯示

話不多說&#xff0c;先上效果圖 代碼示例&#xff1a; #include <QApplication> #include <QWidget> #include <QPainter> #include <QPropertyAnimation> #include <QTimer> #include <cmath>class WaveProgressBar : public QWidget {…

Linux vim mode | raw / cooked

注&#xff1a;機翻&#xff0c;未校。 vim terminal “raw” mode Vim 終端 “raw” 模式 1. 原始模式與已處理模式的區別 We know vim puts the terminal in “raw” mode where it receives keystrokes as they are typed, opposed to “cooked” mode where the command…

docker部署dify

1.安裝docker 參考鏈接 https://ascendking.blog.csdn.net/article/details/136407383 設置docker源 vim /etc/docker/daemon.json {"registry-mirrors": ["https://docker.registry.cyou", "https://docker-cf.registry.cyou", "http…

Python Seaborn面試題及參考答案

目錄 如何用 stripplot () 繪制帶隨機偏移的分類散點圖?如何控制 jitter 參數? swarmplot () 如何避免散點重疊?適用場景與數據量限制是什么? 使用 catplot () 繪制箱線圖時,如何通過 kind 參數切換圖表類型? 如何通過 hue 參數在分類圖中添加第三個維度(如性別)? …

Linux應用:Linux的信號

什么是信號 信號是一種軟件中斷&#xff0c;用于通知進程系統中發生了某種特定事件。它是操作系統與進程之間&#xff0c;以及進程與進程之間進行異步通信的一種方式。在 Linux 系統中&#xff0c;信號是一種比較簡單的進程間通信機制。當一個信號產生時&#xff0c;內核會通過…

實時監控、數據分析!Web-Check構建你的網站健康檢測系統實操方案

文章目錄 前言1.關于Web-Check2.功能特點3.安裝Docker4.創建并啟動Web-Check容器5.本地訪問測試6.公網遠程訪問本地Web-Check7.內網穿透工具安裝8.創建遠程連接公網地址9.使用固定公網地址遠程訪問 前言 在數字化運維領域&#xff0c;網站穩定性保障始終是開發者和運維團隊的核…

win32匯編環境,網絡編程入門之八

;在上一教程里&#xff0c;我們學習了簡單的處理服務器返回的數據 ;在這一教程里&#xff0c;我們了解一下&#xff0c;當連接上網站后&#xff0c;應該發送什么數據過去的問題 ;這里有個簡單的方式學習&#xff0c;以下是一個示例 ;我們上網的時候可以用谷歌瀏覽器&#xff0c…