为什么指南说明"避免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
,调用方仍然可以错过等待并遇到同样的问题,对吧?因此,问题是,为什么不指导而不是说 - 不要避免等待任务
答案 0 :(得分:2)
在该操作完成之前,您并不总是想要来阻止该方法的其余部分执行。有时你会在完成之前做一些你可以做的事情,所以你想稍后等待它,也许一个调用者恰好不需要结果,所以它可以安全地忽略它等等。重点是,因为该方法返回一个Task
由打电话者根据他们的意愿来做。如果他们想在该任务完成时做某事,或者知道它是成功还是失败,他们可以,如果他们不那么好。
当该方法是async void
方法从您手中取出时。调用者被置于他们无法知道操作何时完成的位置,即使他们确实需要知道。这不是在编写方法时应该做出的决定。那个方法不会知道谁会打电话给它,以及他们是否需要知道什么时候/它是否已经完成,所以在编写方法时你需要假设有人将想要那些信息。
所有这一切都表示解雇异步方法并完全忽略它应该是非常罕见的。 是适合的情况,但任何时候它都应该是一个大红旗。当发生时,它应该是该方法的调用者,决定他们不关心该操作何时完成,而不是该方法的作者决定没有人能够知道什么时候结束(再次,在一些非常特殊的情况之外)。
答案 1 :(得分:-2)
您可以这样做,即您可以取消或不等待task
完成。
但是可能有一种情况,你开发了API
多个projects
使用的方法,并且使用你的方法的一些项目想要等待完成调用,尽管方法是在方法完成后,只返回检查或做工作。
在那个senario中它很有用,这就是你必须返回Task
而不是void
的原因。它可以帮助其他使用您方法的人。
这是你所提出的问题的逻辑原因之一。