2012-08-01 19 views
1

如何在控制器方法中等待异步结果?这似乎是微不足道的实施,但到目前为止我还没有找到一个很好的例子,干净优雅。以与启动它不同的控制器方法等待异步结果

这是问题所在。我有两个控制器方法。方法A和方法B.方法A通过TaskFactory启动一个长时间运行的进程,并在进程结束时使用ContinueWith更新缓存的值。 A和B之间有一些中间步骤。现在,当我到达方法B时,我需要检查缓存中的值。如果缓存中的值尚未更新,则需要等待x秒的时间并定期检查值是否已更新。

我宁愿在控制器中处理所有这些,所以客户端不必轮询结果(并且不得不重写控制器来处理轮询)。但我一直没有找到一种方法来实现控制器方法内的轮询,该方法在超时过期之前不会阻塞(我担心线程池饿死)。也许没有一个干净的实现,我可以在这里使用。如果投票是正确的还是唯一的答案,我将不得不接受它。

回答

2

HTTP是一种无状态协议。您无法在不阻止的情况下在服务器上实施此类轮询。你有两个可能性:在客户端上

  • 轮询 - 有客户在使用AJAX定期捶你的服务器请求
  • 使用推,并有服务器通知时,一些任务完成客户端(S) - 结账SignalR
+0

看来投票可能是我可以做的最好的事情给予的情况。 SignalR似乎是一个很好的选择,我只是不确定我想在应用程序的一个地方使用推式通知。 – 2012-08-01 17:40:21

0

您可以等待mvc 4获取异步控制器或获取mvc 4和.net 4.5的测试版。

+0

您不需要等待MVC 4.自MVC 3以来就存在异步控制器。但是它们不会帮助OP试图实现的目标。 – 2012-08-02 15:37:48