0

情况:一个大规模的 Azure IIS7 应用程序,它必须这样做:

  1. 接收请求
  2. 将请求负载放入队列以进行解耦异步处理
  3. 保持与客户端的连接
  4. 等待异步进程完成的通知
  5. 回复客户

请注意,这些将是长时间运行的进程(30 秒到 5 分钟)。

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

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

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

4

1 回答 1

1

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

于 2012-09-19T08:00:38.420 回答