主頁 > .NET開發 > C#異步方法async/await的三種回傳型別

C#異步方法async/await的三種回傳型別

2023-05-16 15:33:24 .NET開發

有群友問C#異步方法async回傳值Task和void的區別?看似簡單,但不容易把它們用好,在C#中的異步編程已經成為現代編程的標配,異步方法(async/await)是實作異步編程的一種常用方式,在異步方法中,可以使用 Task 或 void 作為回傳型別,還可以使用ValueTask回傳型別,本文將介紹異步方法中3個回傳型別 Task 、void和ValueTask,

一、 void型別

使用 void 作為異步方法的回傳型別,表示該方法將執行異步操作,但不會回傳任何結果,由于異步方法無法回傳結果,因此呼叫該方法的代碼無法使用 await 關鍵字來異步等待其結果,相反,可以使用事件或回呼函式來處理異步操作的結果,但是,使用回呼函式或事件來處理異步操作的結果比使用 await 關鍵字更加繁瑣和難以維護,示例如下:

public async void DoSomethingAsync()
{
    // 異步操作
    await LongRunningOperationAsync();

    // 操作完成后觸發事件
    OnOperationCompleted();
}

使用場景:

從上看是比較難用的,那么我們看看它的具體使用場景有哪些?一般在 Windows Forms 應用程式中,使用異步方法來處理 UI 事件的方式就是使用 void 作為回傳型別,在異步方法中,可以執行一些 IO 操作、計算等操作,并在操作完成后通過委托或事件通知 UI 執行緒更新 UI,普通方法不建議使用,可以直接回傳Task,

二、Task型別

Task 比較常用并且推薦使用的回傳型別,使用 Task 作為異步方法的回傳型別,可以讓異步方法回傳一個異步操作的結果,呼叫該方法的代碼可以使用 await 關鍵字來異步等待該結果,當異步操作完成時,Task 將包含異步操作的結果,這種方式可以更好地支持異步編程和錯誤處理,案例如下:

//回傳一個 Task<int> 物件,表示該方法將回傳一個異步操作的結果.
public async Task<int> CalculateAsync()
{
    // 異步計算操作
    int result = await LongRunningOperationAsync();

    // 回傳異步操作的結果
    return result;
}

Task 的使用場景

當異步方法需要回傳一個異步操作的結果時,應該使用 Task 作為回傳型別,在這種情況下,Task 可以讓呼叫代碼使用 await 關鍵字來等待異步操作的結果,Task 還提供了一些有用的方法和屬性,如例外處理、取消操作等,可以更好地支持異步編程和錯誤處理,

例如,在 Web API 中,使用異步方法來處理 HTTP 請求的方式就是使用 Task 作為回傳型別,在異步方法中,可以執行一些 IO 操作、資料庫查詢、計算等操作,并將結果封裝到 Task 物件中回傳,客戶端可以使用 await 關鍵字等待異步操作完成,并獲取操作的結果,

、ValueTask型別

ValueTask 是 .NET Core 2.1 引入的一種新的異步編程模式,用于優化記憶體分配和性能,尤其是在大量的異步操作中,ValueTask 作為一種新的異步編程模式,可以在某些情況下更加高效地處理異步操作,ValueTask 本身是一個結構體,它可以用于打包異步操作的結果,并且可以避免 Task 物件的不必要的分配,在使用 ValueTask 時,如果異步操作已經完成,則可以直接從 ValueTask 中獲取結果,而無需等待 Task 物件的狀態,如果異步操作尚未完成,則可以通過異步等待來等待操作完成,

//使用 ValueTask<int> 作為回傳型別,可以避免創建 Task 物件和其他不必要的開銷,
public async ValueTask<int> ComputeAsync(int x, int y)
{
    // 模擬一些耗時的計算操作
    await Task.Delay(1000);
    // 計算結果
    var result = x + y;
    // 回傳結果
    return result;
}
//歡迎關注公眾號:DOTNET開發跳槽,領取海量面試題,加微信號xbhpnet入群

使用場景

1、大量的異步操作

在高并發的情況下,使用 Task 物件可能會導致大量的記憶體分配和垃圾回收,使用 ValueTask 可以避免不必要的記憶體分配,從而提高性能和效率,

2、頻繁的異步操作

在一些需要頻繁執行的異步操作中,使用 Task 可能會產生過多的垃圾,而使用 ValueTask 可以更好地管理記憶體并提高性能,

3、長時間運行的異步操作

在一些長時間運行的異步操作中,使用 Task 可能會導致大量的記憶體分配和垃圾回收,而使用 ValueTask 可以更好地管理記憶體并提高性能,

結語

Task 、void和ValueTask 作為異步方法的回傳型別,應該根據實際需求和編程方式來選擇合適的型別,大家可以參考文中他們各自的使用場景,希望本文對你有所識訓,你對Task 、void和ValueTask 三個回傳型別有什么看法歡迎留言討論,

參考:微軟官方檔案,chatgpt

來源公眾號:DotNet開發跳槽

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/552597.html

標籤:C#

上一篇:OData WebAPI實踐-與ABP vNext集成

下一篇:返回列表

標籤雲
其他(159130) Python(38137) JavaScript(25431) Java(18044) C(15227) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7191) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1973) 功能(1967) Web開發(1951) HtmlCss(1937) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1877) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#異步方法async/await的三種回傳型別

    有群友問C#異步方法async回傳值Task和void的區別?看似簡單,但不容易把它們用好。在C#中的異步編程已經成為現代編程的標配,異步方法(async/await)是實作異步編程的一種常用方式。在異步方法中,可以使用 Task 或 void 作為回傳型別,還可以使用ValueTask回傳型別。本 ......

    uj5u.com 2023-05-16 15:33:24 more
  • OData WebAPI實踐-與ABP vNext集成

    本文屬于 OData 系列文章 ABP 是一個流行的 ASP. NET 開發框架,舊版的的 ABP 已經能夠非常好的支持了 OData ,并提供了對應的 OData 包。 ABP vNext 是一個重新設計的,面向微服務的框架,提供了一些非常有用的特性,包括分頁查詢等但是它并不能原生支持 OData ......

    uj5u.com 2023-05-16 15:33:04 more
  • VB.NET 截取字串

    在VB.NET中,您可以使用Substring方法或Split方法來截取字串。 Substring方法允許您從字串中提取一個子字串,該子字串從指定的起始索引開始,并繼續到字串的末尾或指定的長度。以下是使用Substring方法截取字串的示例: Dim str As String = "H ......

    uj5u.com 2023-05-16 07:41:42 more
  • 修改NuGet包默認存放位置

    默認情況下,NuGet下載的包存放在系統盤(C盤中),這樣一來,時間長了下載的包越多,C盤占用的空間也就越多。 🍕1、問題描述 默認情況下,NuGet下載的包存放在系統盤(C盤中,一般在路徑C:\Users\用戶.nuget\packages下),這樣一來,時間長了下載的包越多,C盤占用的空間也就 ......

    uj5u.com 2023-05-16 07:36:00 more
  • 基于DevExpress的GridControl實作的一些界面處理功能

    <a href="https://www.cnblogs.com/wuhuacong/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u8867.png" alt="" /></a>...

    uj5u.com 2023-05-16 07:28:49 more
  • 【開源游戲】Legends-Of-Heroes 基于ET 7.2的雙端C#(.net7 + Uni

    <a href="https://www.cnblogs.com/flamesky/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/510084/20131103164042.png" alt="" /><...

    uj5u.com 2023-05-10 10:20:23 more
  • 基礎-字串駐留池

    <a href="https://www.cnblogs.com/netcore5/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/1920368/20200602132718.png" alt="" />&l...

    uj5u.com 2023-05-10 10:20:13 more
  • WEB API .NET環境發布

    <a href="https://www.cnblogs.com/donywc/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2800973/20220609165707.png" alt="" /><...

    uj5u.com 2023-05-10 10:19:39 more
  • C#自定義例外就這么簡單

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-05-10 10:18:55 more
  • 聊一聊 dotnet-trace 調查 lock鎖競爭

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-05-10 10:18:41 more