当一个被等待执行的异步方法抛出异常时,该异常会被存储起来并且延迟抛出。在WinForms或WPF应用程序中,它使用
如何防止从异步方法抛出的异常导致应用程序崩溃?
编辑:
显然,我所描述的问题是因为我有
SynchronizationContext.Current
来推迟抛出异常。然而,在控制台应用程序等应用程序中,它会在线程池上抛出异常并使应用程序崩溃。如何防止从异步方法抛出的异常导致应用程序崩溃?
编辑:
显然,我所描述的问题是因为我有
void
async
方法。请查看评论。
void
时,未处理的异常才会以这种方式运行。这是尽可能避免使用async void
方法的原因。 - svickasync void
方法会产生确定性行为;如果调用返回Task
的函数时发生异常并且不等待该任务,那么在未来某个半随机时间点上,当垃圾回收器运行时,将引发UnobservedTaskException
事件,如果什么都不做,则程序会静默继续,好像一切正常。问题不在于async void
方法,它们只是暴露了真正的问题。如果您从async
方法中不调用返回Task
的函数,则很有可能您正在做一些错误的事情。 - user743382UnobservedTaskException
在这里不是问题? - Pieter van Ginkelasync void
的必要性持有异议。如果你需要一个async
事件处理程序(通常在UI应用程序中),那么你会使用它,但其他情况下则不需要。ASP.NET WebAPI和MVC将大多数顶级入口点提供为async Task
。对于op的情况(控制台应用程序),我仍然更喜欢async Task
而不是async void
。 - Stephen Cleary