欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#異步方法返回void與Task的區(qū)別詳解

 更新時(shí)間:2021年03月04日 12:03:56   作者:金慶  
這篇文章主要給大家介紹了關(guān)于C#異步方法返回void與Task的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

C#異步方法返回void和Task的區(qū)別

如果異步(async關(guān)鍵字)方法有返回值,返回類型為T時(shí),返回類型必然是 Task<T>。

但是如果沒有返回值,異步方法的返回類型有2種,一個(gè)是返回 Task, 一個(gè)是返回 void:

 public async Task CountDownAsync(int count)
 {
  for (int i = count; i >= 0; i--)
  {
   await Task.Delay(1000); 
  }
 }

 public async void CountDown(int count)
 {
  for (int i = count; i >= 0; i--)
  {
   await Task.Delay(1000);
  }
 }

調(diào)用時(shí),如果返回 Task, 但返回值被忽略時(shí),VS 會(huì)用綠色波浪線警告:

 CountDownAsync(3);
 ~~~~~~~~~~~~~~~~~

信息為:

(awaitable) Task AsyncExample.CountDownAsync(int count)

Usage:
 await CountDownAsync(...);

Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

中文為:

CS4014:由于此調(diào)用不會(huì)等待,因此在此調(diào)用完成之前將會(huì)繼續(xù)執(zhí)行當(dāng)前方法。請(qǐng)考慮將"await"運(yùn)算符應(yīng)用于調(diào)用結(jié)果。

添加 await 后就正常了:

 await CountDownAsync(3);

如果調(diào)用者不是一個(gè)異步方法,因?yàn)橹挥性诋惒椒椒ㄖ胁趴梢允褂?await,

或者并不想在此等待,如想同時(shí)執(zhí)行多個(gè) CountDownAsync(),

就不能應(yīng)用 await 來消除警告。

此時(shí)可以改用 void 返回值的版本:

void Test()
{
 ...
 CountDown(3);
 CountDown(3);
 ...
}

async void CountDown(int count)
{
 for (int i = count; i >= 0; i--)
 {
  await Task.Delay(1000);
 }
}

Never call async Task methods without also awaiting on the returned Task. If you don't want to wait for the async behaviour to complete, you should call an async void method instead.

摘自:http://www.stevevermeulen.com/index.php/2017/09/using-async-await-in-unity3d-2017/

CountDown() 可以直接調(diào)用 CountDownAsync() 實(shí)現(xiàn):

async void CountDown(int count)
{
 await CountDownAsync(count);
}

使用下劃線變量忽略異步方法的返回值也可以消除警告:

void Test()
{
 ...
 _ = CountDownAsync(3);
 _ = CountDownAsync(3);
 ...
}

但是這樣同時(shí)也會(huì)忽略 CountDownAsync() 中的異常。如以下異常會(huì)被忽略。

void Test()
{
 ...
 _ = CountDownAsync(3);
 ...
}

async Task CountDownAsync(int count)
{
 for (int i = count; i >= 0; i--)
 {
  await Task.Delay(1000); 
 }
 throw new Exception();
}

如果是調(diào)用返回 void 的異步方法,Unity 會(huì)報(bào)錯(cuò):

Exception: Exception of type 'System.Exception' was thrown.

對(duì) Async 后綴的說明

You could say that the Async suffix convention is to communicate to the API user that the method is awaitable. For a method to be awaitable, it must return Task for a void, or Task<T> for a value-returning method, which means only the latter can be suffixed with Async.

摘自:https://stackoverflow.com/questions/15951774

grpc 生成的代碼中,異步請(qǐng)求返回了一個(gè) AsyncCall 對(duì)象,AsyncCall 實(shí)現(xiàn)了 GetAwaiter() 接口:

  public virtual grpc::AsyncUnaryCall<global::Routeguide.Feature> GetFeatureAsync(global::Routeguide.Point request, ...)

可以這樣調(diào)用并等待:

 var resp = await client.GetFeatureAsync(req);

雖然返回類型不是Task<>, 但是可等待,所以添加了 Async 后綴。

總結(jié)

到此這篇關(guān)于C#異步方法返回void與Task區(qū)別的文章就介紹到這了,更多相關(guān)C#異步方法返回區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中截取字符串的的基本方法詳解

    C#中截取字符串的的基本方法詳解

    這篇文章主要介紹了C#中截取字符串的的基本方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • C#中的composite模式示例詳解

    C#中的composite模式示例詳解

    Composite組合模式屬于設(shè)計(jì)模式中比較熱門的一個(gè),相信大家對(duì)它一定不像對(duì)訪問者模式那么陌生,這篇文章主要介紹了C#中的composite模式,需要的朋友可以參考下
    2022-06-06
  • 淺析.NET中AsyncLocal的實(shí)現(xiàn)原理

    淺析.NET中AsyncLocal的實(shí)現(xiàn)原理

    這篇文章主要為大家詳細(xì)介紹了.NET中AsyncLocal的具體實(shí)現(xiàn)原理,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,如果有講得不清晰或不準(zhǔn)確的地方,還望指出
    2023-08-08
  • C#私有構(gòu)造函數(shù)使用示例

    C#私有構(gòu)造函數(shù)使用示例

    本文主要介紹了C#私有構(gòu)造函數(shù)使用方法,私有構(gòu)造函數(shù)是一種特殊的實(shí)例構(gòu)造函數(shù)。它通常用在只包含靜態(tài)成員的類中。如果類具有一個(gè)或多個(gè)私有構(gòu)造函數(shù)而沒有公共構(gòu)造函數(shù),則其他類(除嵌套類外)無法創(chuàng)建該類的實(shí)例
    2014-01-01
  • 深入理解C#的數(shù)組

    深入理解C#的數(shù)組

    本篇文章主要介紹了C#的數(shù)組,數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),詳細(xì)的介紹了數(shù)組的聲明和訪問等,有興趣的可以了解一下。
    2016-11-11
  • C# ConfigHelper 輔助類介紹

    C# ConfigHelper 輔助類介紹

    ConfigHelper(包含AppConfig和WebConfig), app.config和web.config的[appSettings]和[connectionStrings]節(jié)點(diǎn)進(jìn)行新增、修改、刪除和讀取相關(guān)的操作。
    2013-04-04
  • c#中如何獲取指定字符前的字符串

    c#中如何獲取指定字符前的字符串

    這篇文章主要介紹了c#中如何獲取指定字符前的字符串問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • c#獲取當(dāng)前年的周數(shù)及當(dāng)前月的天數(shù)示例代碼

    c#獲取當(dāng)前年的周數(shù)及當(dāng)前月的天數(shù)示例代碼

    本篇文章主要是對(duì)c#獲取當(dāng)前年的周數(shù)及當(dāng)前月的天數(shù)示例代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-01-01
  • WinForm中DataGridView添加,刪除,修改操作具體方法

    WinForm中DataGridView添加,刪除,修改操作具體方法

    這篇文章介紹了WinForm中DataGridView添加,刪除,修改操作具體方法,有需要的朋友可以參考一下
    2013-10-10
  • winform多線程組件BackgroundWorker使用

    winform多線程組件BackgroundWorker使用

    這篇文章介紹了winform多線程組件BackgroundWorker的使用方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論