2011-04-22 23 views
0

我試圖使用BackgroundWorker class啓動一個新線程,該線程在網站啓動時將大量對象加載到緩存中。從新線程將對象加載到緩存中

我迄今爲止代碼:

private void PreLoadCachedSearches() 
{ 
    var worker = new BackgroundWorker() { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; 
    worker.DoWork += new DoWorkEventHandler(DoWork); 
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted); 
    worker.RunWorkerAsync(); 
} 

private static void DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Do the cache loading... 
    var x = HttpContext.Current.Cache; // BUT the Cache is now null!!!! 
} 

private static void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Logging? 
} 

我把代碼在Global.asax.cs中和Application_Start活動期間撥打PreLoadCachedSearches:新的線程啓動,但每當它試圖訪問失敗通過HttpContext.Current.Cache緩存,其爲空。我假設HttpContext不存在/在我用BackgroundWorker開始的新線程中不可用。 我也嘗試將代碼移動到單獨的頁面,並手動啓動線程而不是通過Application_Start事件 - 同樣的問題。
如果我在Web應用程序的上下文中調用我的緩存加載代碼(即無線程),它就可以工作。

  • 我該如何解決這個問題?傳入主線程緩存的引用或以某種方式訪問​​它?

這個問題是這個前一個問題Asynchronous task in ASP.NET的延續。

+1

backgroundworker是爲WinForms和WPF設計的。它在ASP.NET應用程序中沒有用處。 – 2011-04-22 10:46:57

+0

這就是我的想法!但有幾個人評論說它可以在ASP.NET中使用... – 2011-04-22 10:48:39

回答

3

您沒有HttpContext,因爲該線程不參與服務Http請求。

嘗試HttpRuntime.Cache

+0

非常好,謝謝! :) – 2011-04-22 10:52:02

+0

這也是在WinForm應用程序中使用HttpRuntime緩存的方法。 – SPFiredrake 2012-05-30 21:28:20

1

你可以通過HttpContex.Current作爲參數做到這一點;

private void PreLoadCachedSearches() 
{ 
    var worker = new BackgroundWorker() { WorkerReportsProgress = false, WorkerSupportsCancellation = true }; 
    worker.DoWork += new DoWorkEventHandler(DoWork); 
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted); 
    worker.RunWorkerAsync(HttpContext.Current); 
} 

private static void DoWork(object sender, DoWorkEventArgs e) 
{ 
    HttpContext.Current = (HttpContext)e.Argument; 
    var x = HttpContext.Current.Cache; 
} 

private static void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Logging? 
} 
相關問題