2011-11-04 108 views
0

我有一個ASP.NET MVC 3(.NET 4)Web應用程序。關閉異步線程並將數據保存在緩存中

此應用程序從Oracle數據庫中提取數據並將一些信息與另一個Sql數據庫混合。
許多表連接在一起,涉及到大量的數據庫讀取。
我已經優化了最好的我可以抓取邊,我沒有問題。
我使用緩存來保存信息,我不需要一遍又一遍地讀取。

現在我想構建一個響應式界面,我的目標是向用戶展示已過濾的訂單標題,並在後臺加載訂單行。

我想這樣做,因爲我需要管理所有行(訂單行)作爲一些計算的整個原因。

我到目前爲止所做的是使用jQuery對我的操作進行Ajax調用,在該操作中獲取訂單頭並將它們保存在緩存中(System.Web.Caching.Cache)。
當Ajax調用成功時,我觸發另一個Ajax調用來獲取行(並再次將結果保存在緩存中)。

它工作得很好。

現在我試圖弄清楚是否可以將這些邏輯從客戶端移動到服務器。

當我的動作被調用時,我想獲取訂單頭並開始一個新的線程 - 負責訂單行取回 - 並將結果返回給客戶端。

在測試程序,我都嘗試ThreadPool.QueueUserWorkItemTask.Factory,但我想生成的線程訪問我的緩存。

我已經把一個測試應用程序,並做了這樣的事情:

TEST 1

[HttpPost] 
public JsonResult RunTasks01() 
{ 
    var myCache = System.Web.HttpContext.Current.Cache; 
    myCache.Remove("KEY1"); 

    ThreadPool.QueueUserWorkItem(o => MyFunc(1, 5000000, myCache)); 

    return (Json(true, JsonRequestBehavior.DenyGet)); 
} 

TEST 2

[HttpPost] 
public JsonResult RunTasks02() 
{ 
    var myCache = System.Web.HttpContext.Current.Cache; 
    myCache.Remove("KEY1"); 

    Task.Factory.StartNew(() => 
    { 
     MyFunc(1, 5000000, myCache); 
    }); 

    return (Json(true, JsonRequestBehavior.DenyGet)); 
} 

MYFUNC包裝箱列表項目並將結果保存在緩存中;很愚蠢,但這只是一個測試。

我想知道如果有人有更好的解決方案或知道一些暗示我可能訪問緩存在一個單獨的線程?

有什麼我需要注意的,我應該避免或者我可以改善?

感謝您的幫助。

回答

1

我可以用你的方法看到的一個可能的問題是System.Web.HttpContext.Current可能無法在單獨的線程中使用。由於此線程稍後可以運行,請求完成後。我建議你使用.NET 4.0中引入的System.Runtime.Caching命名空間中的類而不是舊的HttpContext.Cache。

+0

謝謝Darin。我以爲我的緩存可能有問題。我不知道System.Runtime.Caching。我會看看它。 – LeftyX