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