重新访问异步void方法的用例

我知道最好的做法是避免除异步事件处理程序之外的任何async void方法,并且对其他用例有很强的专家意见 。 然而,我只是参与了关于async void方法的有用性的简短讨论 ,我有几个问题:

  • 框架如何跟踪挂起的async void方法,包括事件处理程序? 有没有办法获取它们的当前列表或取消它们( 编辑 :可能通过安装自定义SynchronizationContext跟踪)?
  • 它们对火灾和遗忘记录有用吗? 我认为它们实际上可能是,只要在方法开始时保留了正确的时间戳,它仍然可以同步执行。

框架如何跟踪挂起的异步void方法,包括事件处理程序?

该框架没有做任何特殊的事情来跟踪异步void方法。 它们就像任何其他异步方法一样。

此外,您的方法要么具有适当的签名,要么没有; 事件处理程序并不关心,也没有逻辑可以专门检测或使用异步。

自定义调度程序将能够跟踪正在运行的任务,但如果是来自异步void方法,则没有任何特定知识。 我不认为这是正确的解决方案 – 如果您发现自己需要跟踪异步void方法,则需要重新考虑您的设计。

它们对于即发即弃的日志记录方案有用吗? 我认为它们实际上可能是,只要保留正确的时间戳

我不知道你的时间戳是什么意思?

对于调用者永远不需要关心方法调用的结果,或者在其他地方通知结果的任何方法,异步void都可以。 这些案件应该非常罕见。

虽然我觉得人们经常滥用“一劳永逸”而最终只是隐藏了自己的重要错误,但是“即发即忘”可能就是这样一种情况。

它们对火灾和遗忘记录有用吗?

从概念上讲,我会这么说,但是如果一个任务有exception并且没有通过等待它或访问它在异步void方法中没有发生的Exception属性来处理它将会拆除你的应用程序。 所以我会避免这种情况。