C#异步方法await用法疑问:程序提前终止及冗余await处理方案
问题原因
- 你当前的
Main方法是同步方法,调用Test()时仅触发了异步任务的启动,没有等待该异步任务执行完成。当Main方法执行完毕后,进程会直接终止,所有未完成的后台异步任务都会被强制结束,因此await Test2();之后的代码没有机会运行。
修复方案
有两种常用修改方式:
方式1:使用异步Main(推荐,C# 7.1及以上版本支持)
将Main方法修改为异步返回Task,并等待Test()执行完成:
public static async Task Main() { await new Program().Test(); }
方式2:同步等待任务完成(兼容旧版本C#)
调用Wait()方法阻塞等待异步任务执行完成:
public static void Main() { new Program().Test().Wait(); }
修改后程序就会完整输出三行预期内容。
关于冗余await的疑问
如果await是方法的最后一行代码,确实可以移除async/await关键字,直接返回Task对象即可,不需要额外的异步状态机开销,修改后的Test2写法如下:
public Task Test2() { Console.WriteLine("Task in delay..."); return Task.Delay(5000); }
修改后完全不影响外部调用逻辑,依然可以用await Test2()正常等待执行,效果和原来带async/await的版本完全一致。
内容的提问来源于stack exchange,提问作者Muhammad Jabareen
相关产品推荐
相关产品推荐

