文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中异步方法返回的void和Task有什么区别

2023-06-06 18:37

关注

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);

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯