Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC3-使用AsyncController从数据库预填充ObjectCache_Asp.net Mvc 3_Asynchronous_Asynccontroller - Fatal编程技术网

Asp.net mvc 3 MVC3-使用AsyncController从数据库预填充ObjectCache

Asp.net mvc 3 MVC3-使用AsyncController从数据库预填充ObjectCache,asp.net-mvc-3,asynchronous,asynccontroller,Asp.net Mvc 3,Asynchronous,Asynccontroller,我有一个表单,可以通过AJAX对两个不同的数据源进行搜索。数据相对较小,但返回速度较慢 我构建了一个缓存层来存储第一次查询后的完整结果。。。但是,我希望在用户执行搜索之前,用数据初始化缓存 我应该找一个能做这件事的人吗?有什么建议吗 我想要的行为已更新: 用户请求某些控制器的任何操作ABC,但不一定是搜索操作 在服务器端,该操作检查缓存并异步请求数据(如果为空) 当缓存继续在服务器上填充时,ActionABC返回请求的视图 如果用户随后在填充缓存时执行搜索,则其请求将等待缓存填充完成,否则缓存数

我有一个表单,可以通过AJAX对两个不同的数据源进行搜索。数据相对较小,但返回速度较慢

我构建了一个缓存层来存储第一次查询后的完整结果。。。但是,我希望在用户执行搜索之前,用数据初始化缓存

我应该找一个能做这件事的人吗?有什么建议吗

我想要的行为已更新:

用户请求某些控制器的任何操作ABC,但不一定是搜索操作 在服务器端,该操作检查缓存并异步请求数据(如果为空) 当缓存继续在服务器上填充时,ActionABC返回请求的视图 如果用户随后在填充缓存时执行搜索,则其请求将等待缓存填充完成,否则缓存数据将立即可用
只有当您能够并行执行这两个搜索时,才能从异步控制器中获益

在这种情况下,您的逻辑可能是:

如果在缓存中找到数据,则立即返回结果。 如果在缓存中找不到数据,则启动2个并行异步任务以执行搜索。 同步这些任务,以便在它们都完成后填充缓存并返回最终结果。
另外,如果您选择AsyncController路径,请确保使用async ADO.NET API查询数据库命令。BeginExecuteResult/command.EndExecuteResult,这样您就可以充分利用I/O完成端口,并且在执行昂贵的搜索操作期间不会阻塞工作线程。

我最终不必使用异步控制器

我使用任务工厂触发并忘记一个调用,以便在最初调用控制器时加载数据

Task.Factory.StartNew(() => { var x = GetData(); });
在GetData调用中,我使用LOCK强制后续调用等待缓存被填充

private static object ThisLock = new object();

protected MyData GetData()
{
  if(<MyData in cache>)
    return MyData from cache;

  lock(ThisLock)
  {
    // just entered lock, see if cache was set by previous blocking thread
    if(MyData in cache>)
      return data from cache;

    ... load MyData from database ... 

    ... save MyData  to cache ... 

    return MyData from cache;
  }
}

我相信我可能错报了我想要的行为,并更新了问题。4是我特别关心的。1-3我可以这样做,但如何让其他请求等待是我要确保我做得正确的事情。