我試圖使用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的延續。
backgroundworker是爲WinForms和WPF設計的。它在ASP.NET應用程序中沒有用處。 – 2011-04-22 10:46:57
這就是我的想法!但有幾個人評論說它可以在ASP.NET中使用... – 2011-04-22 10:48:39