1. 程式人生 > >非同步任務,HttpContext.Current為null解決辦法

非同步任務,HttpContext.Current為null解決辦法

最近在開發一個後臺管理系統專案,為了提高登入的速度,就把記錄登入日誌放到一個非同步任務裡面。

Action taskAction = () =>
{
    SaveLog();
};
Task task = new Task(taskAction);
task.Start();

有一段時間日誌記錄是正常的,突然有一天就不work了,本地除錯也能重現這個錯誤,是System.Web.HttpContext.Current為null造成的,獲取不了當前的使用者名稱。

在網上搜了一下,確實很多使用者遇到了,有推薦快取System.Web.HttpContext.Current的,感覺挺麻煩的。

發現這個Current是可以set的,所以就想把當前執行緒裡面的HttpContext.Current傳到日誌執行緒裡面。

public static HttpContext Current { get; set; }

Action是個委託,委託是可以+=的,於是就封裝了一下。

public class AsyncTaskHelper
{
    /// <summary>
    /// 非同步任務之前,設定HttpContext.Current
    /// </summary>
    /// <param name="context"></param>
/// <param name="action"></param> public static void StartTask(HttpContext context, Action action) { Action newAction = () => { if (context == null) { throw new Exception("請確保HttpContext.Current不為null"); } HttpContext.Current
= context; }; newAction += action; Task task = new Task(newAction); task.Start(); } }

呼叫也很簡單

AsyncTaskHelper.StartTask(System.Web.HttpContext.Current, taskAction);