【发布时间】:2015-12-22 07:59:31
【问题描述】:
Visual Studio 会针对此代码发出警告(“因为未等待此调用,所以在调用完成之前继续执行当前方法”)。
static void Main(string[] args)
{
FireAndForget(); // <-- Warning CS4014
// Do something else.
}
static async Task FireAndForget()
{
// Do something (cannot throw).
}
我的理解是,在这种特殊情况下不等待任务是可以的,因为 FireAndForget 永远不会抛出异常。
我没有使用编译指示禁用警告,而是考虑将 FireAndForget 的返回类型从 Task 更改为 void。这有效地使编译器静音。
static async void FireAndForget() // <-- Task changed to void
{
// Do something (cannot throw).
}
但是,根据Stephen Cleary,应该避免使用“async void”方法,所以我不太确定该怎么做。
如果方法一开始没有被设计为可等待并且不会抛出异常,是否可以使用“async void”方法?
【问题讨论】:
-
该方法一开始就不是可等待的 这是什么意思?
FireAndForget究竟做了什么? -
为什么这到底是被否决+投票结束?
-
@ken2k 我没有投票结束,但我可以看到这将被视为基于意见的问题,没有客观正确的答案。也许“可以吗”可以改写为“有什么优点和缺点”。
-
@Yuval Itzchakov 只是假设 FireAndForget 做了一些 IO 并负责处理所有错误。更好的是:想象一下 FireAndForget 是一种为 .NET 4.0 编写的方法,它正在被移植到 .NET 4.5。
标签: c# async-await