为什么指南说 "avoid async void" 而不是说 "don't avoid awaiting on task"

why guidelines says "avoid async void" rather than saying "don't avoid awaiting on task"

为什么指南说 "avoid async void"。我不知道,但我觉得指南应该说 - “await task”。 async void 的问题是调用者不知道是否需要 await 来完成并且控制将继续执行以下语句。我能理解这带来的不良影响。但是即使 async 方法 returns task 而不是 void,调用者仍然可以错过等待并进入同样的问题,对吧?因此问题是,为什么指南不说 - 不要避免等待任务

您并不总是想要阻止方法的其余部分在该操作完成之前执行。有时你可以在它完成之前做一些事情,所以你想稍后等待,也许一个调用者恰好不需要结果,所以它可以安全地忽略它,等等。关键是,因为方法 returns a Task 由调用者决定如何使用它。如果他们想在任务完成时做某事,或者知道它是成功还是失败,他们可以,如果他们不这样做也没关系。

当方法是 async void 方法时 从您手中拿走 。调用者处于他们无法知道操作何时完成的位置,即使他们确实需要知道。这不是在编写方法时应该做出的决定。该方法不会知道谁将调用它,以及他们是否需要知道 when/if 它已经完成,因此在编写该方法时,您需要假设有人 想要那个信息。

所有这些都表明触发异步方法并完全忽略它应该是非常罕见的。在 种情况下它是合适的,但无论何时您看到它都应该是一个大危险信号。但是,当它 确实 发生时,它应该是方法的 调用者 做出他们不关心该操作何时完成的决定,而不是该方法的作者决定没有人应该知道它何时完成(同样,在一些非常特殊的情况之外)。

你可以这样做,即你可以做空或根本不等待 task 完成。

但是可能会有这样的场景,你开发了一个被多个projects使用的API,一些使用你的方法的项目想要等待完成调用,尽管方法是return 什么都不做,只是为了检查或在方法完成后做工作。

在那个场景中它很有帮助,这就是你必须 return Task 而不是 void 的原因。它可以帮助其他正在使用您的方法的人。

这是与您所提出的问题不同的逻辑原因之一。