C# 非同步執行操作

来源:https://www.cnblogs.com/HoFei/archive/2023/09/01/17672548.html
-Advertisement-
Play Games

為了方便測試非同步,先加個計時 計時相關(可以直接跳過該部分) //開始計時 Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 停止計時 stopwatch.Stop(); //輸出計時毫秒數 stopwatch.ElapsedM ...


為了方便測試非同步,先加個計時

計時相關(可以直接跳過該部分)

//開始計時

Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();

// 停止計時
stopwatch.Stop();

//輸出計時毫秒數

stopwatch.ElapsedMilliseconds

阻塞延遲,下麵兩個分別表示阻塞三秒鐘

同步阻塞:Thread.Sleep(TimeSpan.FromSeconds(3))

非同步阻塞:Task.Delay(3000)

Thread.Sleep(TimeSpan.FromSeconds(3)):

所屬命名空間:System.Threading.Thread

使用線程阻塞:調用該方法會導致當前線程被阻塞,即掛起當前線程的執行。

同步操作:Thread.Sleep 是同步的,意味著它會阻塞當前線程並占用系統資源。

精度較低:具體的暫停時間不一定非常準確,可能會稍微長一些。

 

Task.Delay(3000):

 

所屬命名空間:System.Threading.Tasks.Task

使用任務非同步操作:通過非同步編程模型進行操作,非同步等待指定的時間。

非阻塞操作:Task.Delay 是非同步的,不會阻塞當前線程,而是讓線程可以執行其他任務。

高精度定時器:提供更高的精度,具有更準確的延遲時間。

可以與 async/await 一起使用:await Task.Delay 可以與其他非同步操作一起使用,提供更靈活和響應式的編程體驗。

優缺點比較:

Thread.Sleep 的優點是簡單直接,適用於簡單的線程阻塞場景。然而,它會阻塞當前線程,並且在等待的過程中,當前線程將無法執行其他任務。

Task.Delay 的優點是允許非同步等待一段時間,不會阻塞當前線程,可以與其他非同步操作一起使用,提供更高的性能和響應能力。

此外,它還提供了更準確的定時精度。但是,如果不需要進行非同步編程,或者代碼基於舊版本.NET Framework,可能不適合使用。

介紹非同步幾個關鍵字

 

Task(任務):Task 是.NET Framework 和 .NET Core 中的一個類型,表示一個非同步操作的單元。它可以被執行、等待和取消,並且可以返回結果。可以通過 Task.Run 方法創建一個 Task。

 

 

async/await 關鍵字:async/await 是 C# 5.0 引入的語言特性,用於簡化非同步編程。在方法定義前加上 async 關鍵字來表示這是一個非同步方法,然後可以在方法體內使用 await 關鍵字來暫停方法的執行,等待一個非同步操作完成,然後繼續執行後續的代碼。被 await 修飾的表達式必須是一個返回 Task 或 Task<T> 的非同步方法調用。

 

 

await 關鍵字:await 關鍵字用於非同步方法內部,表示等待一個非同步操作完成。當遇到 await 關鍵字時,方法會立即返回給調用者,同時非同步操作開始執行。等待的過程中,線程可以自由地執行其他任務。當非同步操作完成後,該方法會恢復執行,並返回非同步操作的結果。

 

 

Task.WhenAll 方法:Task.WhenAll 方法用於等待多個非同步任務完成。它接受一個 Task 數組或可迭代對象作為參數,並返回一個新的 Task,該 Task 在所有傳遞的任務都完成後變為完成狀態。你可以使用 await Task.WhenAll 來等待多個任務同時完成。

 

常見的屬性

 

Task.Status 屬性:表示任務的狀態,有以下幾種可能的值:

 

  1. Created:任務已創建但未開始執行。
  2. WaitingForActivation:任務在等待激活,即還未被調度器執行。
  3. WaitingToRun:任務已被調度器接受,並等待在可用線程上運行。
  4. Running:任務正在執行。
  5. WaitingForChildrenToComplete:父任務正在等待其所有子任務完成。
  6. RanToCompletion:任務成功完成。
  7. Faulted:任務發生了異常。
  8. Canceled:任務被取消。

Task.Result 屬性:獲取非同步操作的返回結果。該屬性只能在非同步操作完成後使用,並且會阻塞當前線程直到非同步操作完成。

下麵上代碼示例

async Task Main()
{
    //計時
    Stopwatch stopwatch = new Stopwatch();
    // 開始計時
    stopwatch.Start();
    //執行順序和添加順序有關
    await Task.WhenAll(A());//先執行A
    await Task.WhenAll(B());//等待A執行完再執行B
    List<Task> tasks = new List<Task>()
    { C(),D() };//等待B執行完後CD一起執行
    //也可以逐個添加
    //tasks.Add(A());
    //tasks.Add(B());
    //tasks.Add(C());
    //tasks.Add(D());

    // 等待CD方法全部完成
    await Task.WhenAll(tasks);
    // 停止計時
    stopwatch.Stop();
    Console.WriteLine($"計時結束!總共用時:{stopwatch.ElapsedMilliseconds} 毫秒");
}

async Task A()
{
    Console.WriteLine("阻塞3秒");
    await Task.Delay(3000);
    Console.WriteLine("3秒結束");
}
async Task B()
{
    Console.WriteLine("阻塞2秒");
    await Task.Delay(2000);
    Console.WriteLine("2秒結束");
}
async Task C()
{
    Console.WriteLine("阻塞5秒");
    await Task.Delay(5000);
    Console.WriteLine("5秒結束");
}
async Task D()
{
    Console.WriteLine("阻塞10秒");
    await Task.Delay(10000);
    Console.WriteLine("10秒結束");
}

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在筆者前幾篇文章中我們一直在探討如何利用`Metasploit`這個滲透工具生成`ShellCode`以及如何將ShellCode註入到特定進程內,本章我們將自己實現一個正向`ShellCode`Shell,當進程被註入後,則我們可以通過利用NC等工具連接到被註入進程內,並以對方的許可權及身份執行命令... ...
  • ![](https://img2023.cnblogs.com/other/1218593/202309/1218593-20230901100033869-964667327.png) ## **背景** 在我們平常的編碼中,通常會將一些對象保存起來,這主要考慮的是對象的創建成本。 比如像線程資源 ...
  • 今天推薦一個github的開源工具 [pkgu](https://github.com/Abeautifulsnow/pkgu),支持以表格形式展示當前python環境下的有新版本的package的版本信息,並支持全部或部分更新這些已經過期或者有新版的庫。 該工具目前還提供了 `cache` 功能, ...
  • ## 14.1、概述 ### 14.1.1、編程式事務 > 事務功能的相關操作全部通過自己編寫代碼來實現: ``` Connection conn = ...; try { // 開啟事務:關閉事務的自動提交 conn.setAutoCommit(false); // 核心操作 // 提交事務 co ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 題目描述 - 難度:中等 - 給定一個不含重覆數字的數 ...
  • Hi,大家好,我是一路狂奔的烏龜 很高興遇見你~ 我們可能會在睡前下載文件,而不想自己的電腦一整晚都在運行,浪費電也損耗電腦硬體 基於這個日常需求(你怎麼知道我喜歡在半夜下載文件?) 所以我就開發了這款軟體 至今已經修改了三四個版本了,基本滿足要求了就不再更新了 好了, 接下來,,就容我介紹一下這款 ...
  • ### 一、SiganlR 使用的協議類型 - 1.websocket即時通訊協議 - 2.Server-Sent Events(SSE)伺服器事件 - 3.longpolling 長輪詢。 如果客戶端開啟協商,會按順序選擇可相容的協議。(預設開啟協議協商) 如果客戶端禁用協商,只能websocke ...
  • 基於`.NET 6.0`創建的`WebAPI`項目,自動生成的`appsettings.json`配置模板,在當前項目(dll)中可以通過構造函數註入`Configuration`來讀取。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...