首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

委派實作非同步發送郵件:提升系統回應效能

     編輯:關於.NET

隨著用戶增長,同步發送訂單確認信導致頁面長時間等待,嚴重影響體驗。為解決此問題,需將發信邏輯改為非同步執行。由於既有發信方法已封裝難以修改,採用 委派的非同步呼叫 可在不變更原方法的前提下實現異步化。

核心程式碼範例

delegate void SendEmailDelegate(MyEmail email);

public class MainClass
{
    public static void Main()
    {
        var myEmail = new MyEmail();
        AsyncSend(myEmail);
        Console.WriteLine("主執行緒繼續執行,未阻塞");
        Console.ReadLine();
    }

    static void AsyncSend(MyEmail email)
    {
        SendEmailDelegate del = new SendEmailDelegate(SendEmail);
        AsyncCallback callback = new AsyncCallback(OnSendCompleted);
        // 開始非同步呼叫,傳入委派實例作為 state
        del.BeginInvoke(email, callback, del);
    }

    static void OnSendCompleted(IAsyncResult ar)
    {
        // 模擬其他後續處理
        Thread.Sleep(2000);
        Console.WriteLine("回呼執行:發信流程結束");

        // 必須呼叫 EndInvoke 釋放資源,否則會造成記憶體洩漏
        SendEmailDelegate del = ar.AsyncState as SendEmailDelegate;
        del.EndInvoke(ar);
    }

    static void SendEmail(MyEmail email)
    {
        // 實際發信邏輯 (耗時操作)
        Thread.Sleep(3000); 
        Console.WriteLine("郵件發送完畢");
    }
}

public class MyEmail { }

關鍵點解析

  • 委派宣告:簽章需與目標方法一致。
  • BeginInvoke:啟動非同步執行,參數依序為方法參數、AsyncCallback 回呼、使用者狀態物件 (此處傳委派自身以便 EndInvoke)。
  • EndInvoke:必須呼叫,否則執行緒集區資源無法釋放,長期運行會耗盡資源。
  • 回呼執行緒:AsyncCallback 於執行緒集區執行緒中執行,非主執行緒,注意 UI 更新需跨執行緒處理。

適用場景與現代替代方案

此模式適用於 .NET Framework 早期版本。現代開發建議使用 Task.Run、async/await 或 BackgroundService (裝載服務) 實現更簡潔、可維護的非同步流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved