关闭异步线程并将数据保存在缓存中

问题描述:

我有一个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包装箱列表项目并将结果保存在缓存中;很愚蠢,但这只是一个测试。

我想知道如果有人有更好的解决方案或知道一些暗示我可能访问缓存在一个单独的线程?

有什么我需要注意的,我应该避免或者我可以改善?

感谢您的帮助。

我可以用你的方法看到的一个可能的问题是System.Web.HttpContext.Current可能无法在单独的线程中使用。由于此线程稍后可以运行,请求完成后。我建议你使用.NET 4.0中引入的System.Runtime.Caching命名空间中的类而不是旧的HttpContext.Cache。

+0

谢谢Darin。我以为我的缓存可能有问题。我不知道System.Runtime.Caching。我会看看它。 – LeftyX