91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#中異步方法返回的void和Task有什么區別

發布時間:2021-03-04 14:20:52 來源:億速云 閱讀:589 作者:Leah 欄目:開發技術

C#中異步方法返回的void和Task有什么區別?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

C#異步方法返回void和Task的區別

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

但是如果沒有返回值,異步方法的返回類型有2種,一個是返回 Task, 一個是返回 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);
  }
 }

調用時,如果返回 Task, 但返回值被忽略時,VS 會用綠色波浪線警告:

 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:由于此調用不會等待,因此在此調用完成之前將會繼續執行當前方法。請考慮將"await"運算符應用于調用結果。

添加 await 后就正常了:

 await CountDownAsync(3);

如果調用者不是一個異步方法,因為只有在異步方法中才可以使用 await,

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

就不能應用 await 來消除警告。

此時可以改用 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() 可以直接調用 CountDownAsync() 實現:

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

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

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

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

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

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

如果是調用返回 void 的異步方法,Unity 會報錯:

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

對 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.

grpc 生成的代碼中,異步請求返回了一個 AsyncCall 對象,AsyncCall 實現了 GetAwaiter() 接口:

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

可以這樣調用并等待:

 var resp = await client.GetFeatureAsync(req);

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辉南县| 娱乐| 简阳市| 会同县| 鹤庆县| 名山县| 都昌县| 舒城县| 邯郸县| 宁晋县| 湛江市| 历史| 泸溪县| 黔东| 韶关市| 达拉特旗| 县级市| 金乡县| 清苑县| 焦作市| 奉贤区| 嘉禾县| 资阳市| 大方县| 永寿县| 察雅县| 太白县| 大姚县| 璧山县| 兴宁市| 青冈县| 铁岭市| 武威市| 儋州市| 勃利县| 湟源县| 安化县| 霍城县| 武陟县| 吴桥县| 夏邑县|