【问题标题】:Fire Off an asynchronous thread and save data in cache触发异步线程并将数据保存在缓存中
【发布时间】:2011-11-04 19:14:49
【问题描述】:

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

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

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

我想这样做是因为我需要将所有行(订单行)作为一个整体进行一些计算。

到目前为止,我所做的是使用 jQuery 对我的操作进行 Ajax 调用,在该操作中我获取订单标头并将它们保存在缓存中 (System.Web.Caching.Cache)。
当 Ajax 调用成功后,我启动另一个 Ajax 调用以获取行(并再次将结果保存在缓存中)。

效果很好。

现在我试图弄清楚是否可以将其中的一些逻辑从客户端移动到服务器。

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

在一个测试应用程序中,我尝试了 ThreadPool.QueueUserWorkItemTask.Factory,但我希望生成的线程能够访问我的缓存。

我已经组装了一个测试应用程序并做了这样的事情:

测试 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));
}

测试 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 创建一个项目列表并将结果保存在缓存中;很傻,但这只是一个测试。

我想知道是否有人有更好的解决方案或知道我可能在单独的线程中访问缓存的一些含义?!

有什么我需要注意的,我应该避免还是可以改进?

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢达林。我以为我的缓存可能有问题。我不知道 System.Runtime.Caching。我去看看。
    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2017-06-15
    • 2015-06-14
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多