管理 ASP.NET MVC 控制器中的即發即忘非同步操作
非同步「即發即忘」方法,例如DeleteFooAsync
,在非同步程式設計中經常遇到。雖然傳統建議是在這些情況下避免 async
/await
,但當同步副本不可用時,這可能不切實際。
簡單地使用 TaskScheduler.UnobservedTaskException
處理未觀察到的異常是不可靠的,因為可能會出現同步上下文問題。
將非同步方法包裝在 try-catch 區塊中,如下所示,可以解決異常問題,但對於許多方法來說很麻煩:
<code class="language-csharp">private async void DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch (Exception exception) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
ASP.NET MVC 控制器中的「即發即忘」呼叫最強大的解決方案是使用 Task.Run
:
<code class="language-csharp">Task foo = Task.Run(() => DeleteFooAsync());</code>
這會將非同步操作卸載到單獨的線程,防止其阻塞回應並確保可靠執行。
以上是如何在 ASP.NET MVC 中正確處理「即發即忘」非同步方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!