Azure Web角色 - Monitor.Wait和Thread Starvation

时间:2012-09-16 05:24:56

标签: multithreading asynchronous azure azure-web-roles

情况:高级Azure IIS7应用程序,必须执行此操作:

  1. 接收请求
  2. 将请求有效负载放入队列以进行解耦异步处理
  3. 维护与客户的连接
  4. 等待异步过程已完成的通知
  5. 回复客户
  6. 请注意,这些是长时间运行的过程(30秒到5分钟)。

    如果我们在这里使用Monitor.Wait(...),等待从异步进程回调到同一个Web应用程序,在我们调用的对象上调用Monitor.Pulse(...)Monitor.Wait( ),这会不会匆忙地有效地造成线程饥饿?

    如果是这样,如何减轻这种情况?在这里等待回调是否有更好的模式?例如,我们可以将Response对象放入一个线程安全的字典中,然后以某种方式产生,并让回调代码锁定Response并继续响应客户端吗?如果是这样,怎么样?

    此外,如果异步进程终止,并且从不调用回调,从而永远不会导致Monitor.Pulse()触发怎么办?我们的线程现在挂了吗?

1 个答案:

答案 0 :(得分:1)

根据您的要求,我建议您查看AsyncPage / AsyncController(取决于您使用的是ASP.NET WebForms还是ASP.NET MVC)。这些使您可以在IIS中执行长时间运行的任务,而不会阻塞I / O线程。