触发异步线程并将数据保存在缓存中

时间:2011-11-04 11:09:20

标签: multithreading asp.net-mvc-3 caching threadpool

我有一个ASP.NET MVC 3(.NET 4)Web应用程序。

此应用程序从Oracle数据库中提取数据,并将一些信息与另一个Sql数据库混合 许多表连接在一起,涉及大量数据库读取 我已经优化了我能提供的最好的一面,我没有遇到任何问题 我使用缓存来保存我不需要一遍又一遍地获取的信息。

现在我想构建一个响应式界面,我的目标是向用户显示已过滤的订单标题,并在后台加载订单行。

我想这样做因为我需要管理所有行(订单行)作为一些计算的整体原因。

到目前为止,我所做的是使用jQuery对我的操作进行Ajax调用,获取订单头并将其保存在缓存中(System.Web.Caching.Cache)。 当Ajax调用成功时,我触发另一个Ajax调用来获取行(并再次将结果保存在缓存中)。

效果很好。

现在我试图找出是否可以将一些逻辑从客户端移动到服务器。

当我的操作被调用时,我想获取订单头并开始一个新线程 - 负责获取订单行 - 并将结果返回给客户端。

在测试应用中,我尝试了 ThreadPool.QueueUserWorkItem Task.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 个答案:

答案 0 :(得分:1)

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