TaskMethodAsync()与_ = TaskMethodAsync()两种写法有什么区别?
异步代码两种调用写法的核心区别
这两种写法都属于不需要等待异步方法执行完成、也不需要持有返回Task对象的「发射后不管」调用场景,核心区别如下:
- 编译器警告表现不同
直接调用TaskMethodAsync()时,编译器会检测到你未等待异步任务、也未使用返回的Task对象,会抛出CS4014警告,提示你可能遗漏了await关键字。
用_ = TaskMethodAsync()时,_是C#的弃元符号,相当于明确告知编译器你主动放弃使用返回的Task对象,不需要触发相关提醒,可以直接消除CS4014警告,不需要额外添加警告抑制配置。 - 代码可读性不同
直接写TaskMethodAsync()时,其他开发者无法判断这是你故意设计的发射后不管逻辑,还是不小心漏写了await,容易产生代码误解。
用_ = TaskMethodAsync()可以明确传递出「主动放弃返回值、不需要等待执行」的开发意图,可读性更高,也符合常规的代码规范。 - 运行时逻辑完全一致
两种写法在运行时没有任何差异,都没有持有异步方法返回的Task对象。如果异步方法内部抛出未捕获的异常,都会被封装到Task对象中,在部分.NET版本中如果异常未被观察,可能触发全局未处理任务异常事件,极端情况下会导致进程崩溃。弃元写法只是消除了编译器警告,不会改变运行时的异常处理逻辑。
注意:如果确实需要使用发射后不管的异步调用,建议优先选择弃元写法,同时一定要在异步方法内部做好完整的异常捕获,避免出现未观察异常导致程序异常退出。
内容的提问来源于stack exchange,提问作者Kurris
相关产品推荐
相关产品推荐

