为什么指南说"avoid async void"而不是说"don't avoid awaiting on task"



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

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

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

所有这些都表明,触发异步方法并完全忽略它应该非常罕见。在某些情况下,它是合适的,但只要你看到它,它都应该是一个大红旗。 但是,当它确实发生时,应该是方法的调用方做出他们不关心该操作何时完成的决定,而不是该方法的作者决定没有人应该能够知道它何时完成(同样,除了一些非常特殊的情况)。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新