为什么指南说“避免async
void
”。我不知道,但我觉得指南应该说-“ await
task
”。问题async void
是调用者将不知道它是否需要await
完成并且控制将继续执行以下语句。我能理解这带来的不良影响。但是即使async
方法返回task
而不是void
,调用者仍然可能错过等待并遇到相同的问题,对吗?因此问题是,为什么不指导方针而不是说 -不要避免等待任务
2 回答
您并不总是希望在该操作完成之前阻止该方法的其余部分执行。有时你可以在它完成之前做一些事情,所以你想稍后等待它,也许一个调用者恰好不需要结果,所以它可以安全地忽略它等等。关键是,因为该方法返回一个Task
由调用者决定如何处理它。如果他们想在任务完成时做某事,或者知道它是成功还是失败,他们可以,如果他们不这样做也没关系。
当方法是从你手中拿走async void
的方法时。调用者处于一个他们无法知道操作何时完成的位置,即使他们真的需要知道。这不是在编写方法时应该做出的决定。该方法不会知道谁会调用它,以及他们是否需要知道何时/是否完成,因此在编写该方法时,您需要假设有人会想要该信息。
所有这一切都表明触发异步方法并完全忽略它应该是非常罕见的。在某些情况下它是合适的,但任何时候你看到它都应该是一个很大的危险信号。但是,当它确实发生时,应该是方法的调用者做出他们不关心该操作何时完成的决定,而不是方法的作者决定没有人应该能够知道它何时完成(再次,在一些非常特殊的情况之外)。
你可以这样做,即你可以做 void 或根本不等待task
完成。
但是可能不会出现这样一种情况,即您开发了一个API
由多个projects
使用的项目,并且一些使用您的方法的项目希望等待完成调用,尽管该方法不会返回任何内容,只是为了检查或在方法完成后做工作.
在那个场景中它很有帮助,这就是你不能返回的Task
原因void
。它可以帮助使用您的方法的其他人。
这是除了您给出的问题之外的逻辑原因之一。