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

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

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

有一段時間日誌記錄是正常的,忽然有一天就不work了,本地調試也能重現這個錯誤,是System.Web.HttpContext.Current爲null形成的,獲取不了當前的用戶名。異步

在網上搜了一下,確實不少用戶遇到了,有推薦緩存System.Web.HttpContext.Current的,感受挺麻煩的。spa

發現這個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);
相關文章
相關標籤/搜索