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

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

clas tpc 異步 set tar 本地 獲取 pre ren

最近在開發一個後臺管理系統項目,為了提高登錄的速度,就把記錄登錄日誌放到一個異步任務裏面。

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);

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