首頁 > 後端開發 > C++ > 如何在 ASP.NET MVC 中安全地實現「即發即忘」非同步方法?

如何在 ASP.NET MVC 中安全地實現「即發即忘」非同步方法?

Barbara Streisand
發布: 2025-01-12 19:37:47
原創
732 人瀏覽過

How to Safely Implement

安全地處理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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板