非同步任務,HttpContext.Current為null解決辦法
阿新 • • 發佈:2019-01-06
最近在開發一個後臺管理系統專案,為了提高登入的速度,就把記錄登入日誌放到一個非同步任務裡面。
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);