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