多執行緒中使用HttpContext.Current為null的解決辦法
阿新 • • 發佈:2021-08-11
記一次專案中遇到的問題。
最近在實現一個商品庫自動同步功能,使用的是Quartz.Net,然後每天凌晨執行一次,執行的時候,會去自動的遍歷資料夾下是否有新增的檔案,如果有,則獲取這些檔案,自動同步到七牛雲空間上。
在這其中,就有用到HttpContext.Current.Server.MapPath() 將相對路徑轉為物理路徑。
直接呼叫方法,是正常的,但是在Quartz.Net執行的時候,用的是多執行緒,所以導致HttpContext.Current獲取到的是null。
通過百度,查詢到的原因如下:
因為多執行緒情況下,當前執行緒可能並非http請求處理執行緒,根本沒發生請求,所以無法獲取到HttpContext就是null.
解決方法可以採用這種:
public static string MapPath(string strPath) { if (HttpContext.Current != null) { return HttpContext.Current.Server.MapPath(strPath);//有http請求 } else //非web程式引用 { strPath = strPath.Replace("/", "\\"); if (strPath.StartsWith("\\")) { //strPath = strPath.Substring(strPath.IndexOf('\\', 1)).TrimStart('\\'); strPath = strPath.TrimStart('\\'); } return System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strPath); } }