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