隨著用戶增長,同步發送訂單確認信導致頁面長時間等待,嚴重影響體驗。為解決此問題,需將發信邏輯改為非同步執行。由於既有發信方法已封裝難以修改,採用 委派的非同步呼叫 可在不變更原方法的前提下實現異步化。
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 { }
AsyncCallback 回呼、使用者狀態物件 (此處傳委派自身以便 EndInvoke)。AsyncCallback 於執行緒集區執行緒中執行,非主執行緒,注意 UI 更新需跨執行緒處理。此模式適用於 .NET Framework 早期版本。現代開發建議使用 Task.Run、async/await 或 BackgroundService (裝載服務) 實現更簡潔、可維護的非同步流程。