0

我有一个通过 AJAX 搜索两个不同数据源的表单。数据比较小,但是返回的速度比较慢。

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

我应该查看AsyncController来执行此操作吗?有什么建议吗?

我想要的行为是(更新):

  1. 用户请求某个控制器的任何 ActionABC(不一定是搜索操作)
  2. 服务器端,该操作检查缓存并在为空时异步请求数据
  3. 当缓存继续在服务器上填充时,ActionABC 返回请求的视图
  4. 如果用户随后在填充缓存时执行搜索,他们的请求将等待直到缓存填充完成,否则缓存数据立即可用
4

2 回答 2

0

仅当您可以并行执行 2 次搜索时,您才能从异步控制器中受益。

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

  1. 如果在缓存中找到数据,则立即返回结果。
  2. 如果在缓存中找不到数据,则启动 2 个并行异步任务来执行搜索。
  3. 同步这些任务,以便在它们都完成后填充缓存并返回最终结果。

此外,如果您要使用 AsyncController 路线,请确保使用异步 ADO.NET API 来查询您的数据库 ( command.BeginExecuteResult/ command.EndExecuteResult),以便您可以充分利用 I/O 完成端口,并且在执行昂贵的搜索期间不会阻塞工作线程操作。

于 2011-09-15T18:58:03.413 回答
0

我最终不必使用 AsyncControllers。

我使用任务工厂“触发并忘记”调用,以在对控制器的任何调用最初加载数据。

Task.Factory.StartNew(() => { var x = GetData(); });

在“GetData”调用中,我使用 LOCK 强制后续调用等待缓存被填充(地址 #4)

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;
  }
}
于 2011-09-23T19:53:20.040 回答