为什么指导说"避免异步无效"而不是说"不要避免等待任务"

时间:2018-03-15 17:27:40

标签: c# asynchronous async-await design-guidelines

为什么指南说明"避免void await"。我不知道,但我觉得指南应该说 - " task async void"。问题await是调用者不知道是否需要async来完成和控制将继续执行以下语句。我能理解这种不良影响。但即使task方法返回void而不是[Autostart] Apache=0 MySQL=0 FileZilla=0 Mercury=0 Tomcat=0 [Checks] CheckRuntimes=1 CheckDefaultPorts=1 [ModuleNames] Apache=Apache MySQL=MySQL FileZilla=FileZilla Mercury=Mercury Tomcat=Tomcat [EnableModules] Apache=1 MySQL=1 FileZilla=1 Mercury=1 Tomcat=0 [EnableServices] Apache=1 MySQL=1 FileZilla=1 Tomcat=0 ,调用方仍然可以错过等待并遇到同样的问题,对吧?因此,问题是,为什么不指导而不是说 - 不要避免等待任务

2 个答案:

答案 0 :(得分:2)

在该操作完成之前,您并不总是想要来阻止该方法的其余部分执行。有时你会在完成之前做一些你可以做的事情,所以你想稍后等待它,也许一个调用者恰好不需要结果,所以它可以安全地忽略它等等。重点是,因为该方法返回一个Task由打电话者根据他们的意愿来做。如果他们想在该任务完成时做某事,或者知道它是成功还是失败,他们可以,如果他们不那么好。

当该方法是async void方法从您手中取出时。调用者被置于他们无法知道操作何时完成的位置,即使他们确实需要知道。这不是在编写方法时应该做出的决定。那个方法不会知道谁会打电话给它,以及他们是否需要知道什么时候/它是否已经完成,所以在编写方法时你需要假设有人想要那些信息。

所有这一切都表示解雇异步方法并完全忽略它应该是非常罕见的。 适合的情况,但任何时候它都应该是一个大红旗。当发生时,它应该是该方法的调用者,决定他们不关心该操作何时完成,而不是该方法的作者决定没有人能够知道什么时候结束(再次,在一些非常特殊的情况之外)。

答案 1 :(得分:-2)

您可以这样做,即您可以取消或不等待task完成。

但是可能有一种情况,你开发了API多个projects使用的方法,并且使用你的方法的一些项目想要等待完成调用,尽管方法是在方法完成后,只返回检查或做工作。

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

这是你所提出的问题的逻辑原因之一。