ASP.NET MVC 中安全实现 Fire-and-Forget 异步方法:处理未处理异常
本文探讨在 ASP.NET MVC 中实现异步方法的“fire-and-forget”模式时可能存在的风险以及最佳实践,重点关注如何处理未观察到的异常。这是一个常见的疑问。
虽然可以使用 Task.Run
或 TaskFactory.StartNew
将同步方法包装在单独的线程中执行,但异步方法却提出了独特的挑战。直接调用异步方法而不进行适当的错误处理可能会导致未观察到的异常,需要更全面的方法来解决这个问题。
一种解决方案是使用自定义包装器方法,例如:
<code class="language-csharp">private async void DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
此方法可以在 TaskFactory.StartNew
中调用,提供了一种更安全的方式来处理异常。但是,这需要为每个要执行的异步方法编写自定义包装器代码。
另一种选择(Stephen Cleary 建议)是使用 BackgroundTaskManager
组件。这种方法允许同时注册同步和异步工作,并通过 TaskScheduler.UnobservedTaskException
处理异常:
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
务必注意,“fire-and-forget” 应谨慎使用。如果 DeleteFooAsync
的结果很重要,建议等待任务完成。但是,如果确实需要这种模式,这些解决方案提供了有效的方法来处理未观察到的异常并防止潜在的系统故障。
以上是如何在 ASP.NET MVC 中安全地实现'即发即忘”异步方法?的详细内容。更多信息请关注PHP中文网其他相关文章!