时间:2021-05-20
如果异步(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:///questions/15951774
grpc 生成的代码中,异步请求返回了一个 AsyncCall 对象,AsyncCall 实现了 GetAwaiter() 接口:
public virtual grpc::AsyncUnaryCall<global::Routeguide.Feature> GetFeatureAsync(global::Routeguide.Point request, ...)可以这样调用并等待:
var resp = await client.GetFeatureAsync(req);虽然返回类型不是Task<>, 但是可等待,所以添加了 Async 后缀。
到此这篇关于C#异步方法返回void与Task区别的文章就介绍到这了,更多相关C#异步方法返回区别内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#多线程与异步的区别详解随着拥有多个硬线程CPU(超线程、双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论。本文主要是想与各位高手一同
本文实例讲述了C#异步执行任务的方法。分享给大家供大家参考。具体如下://异步执行耗时任务(适合不需要等它的执行结果的场景,如发邮件、发短信)Task.Fact
​Task的MSDN的描述如下:【Task类的表示单个操作不会返回一个值,通常以异步方式执行。Task对象是一种的中心思想基于任务的异步模式首次引入
详解C语言函数返回值解析程序一:intmain(){int*p;inti;int*fun(void);p=fun();for(i=0;ib)max=a;else
Task的应用​Task的MSDN的描述如下:【Task类的表示单个操作不会返回一个值,通常以异步方式执行。Task对象是一种的中心思想基于任务的异