0

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

4

2 回答 2

2

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

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

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

于 2018-03-15T17:34:26.673 回答
-2

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

但是可能不会出现这样一种情况,即您开发了一个API由多个projects使用的项目,并且一些使用您的方法的项目希望等待完成调用,尽管该方法不会返回任何内容,只是为了检查或在方法完成后做工作.

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

这是除了您给出的问题之外的逻辑原因之一。

于 2018-03-15T17:34:37.773 回答