安全地處理ASP.NET MVC非同步方法中的「發射即忘」
雖然在ASP.NET應用程式中通常不建議使用「發射即忘」(fire and forget)方法,但在某些情況下,可能需要呼叫非同步方法而不等待其完成。但是,以「發射即忘」方式執行非同步方法會帶來某些風險和限制。
一個風險是,非同步方法中的未處理異常將不會被注意到,並可能導致意外行為。為了解決這個問題,建議訂閱TaskScheduler.UnobservedTaskException
事件來記錄異常並防止它們導致應用程式崩潰。
另一個選擇是建立一個包裝方法,在非同步方法中處理異常,如下所示:
<code class="language-csharp">private async Task DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception ) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
但是,需要注意的是,用try-catch塊包裝每個非同步方法可能會變得冗長且重複。
另一種方法是使用ASP.NET執行時期註冊非同步工作。使用Scott Hanselman的BackgroundTaskManager
庫,您可以並發執行任務並集中記錄異常:
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
此方法將任務註冊到運行時,允許它在ASP.NET請求完成後繼續執行,同時仍然捕獲異常。
最後,如果您確實需要以「發射即忘」的方式執行非同步方法而無需異常處理,可以使用Task.Run()
為非同步操作建立一個新執行緒:
<code class="language-csharp">Task foo = Task.Run( () => DeleteFooAsync() );</code>
但是,必須記住,「發射即忘」只應在您可以容忍未處理異常的潛在後果時才使用。
以上是如何在 ASP.NET MVC 中安全地實現「即發即忘」非同步方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!