情况:一个大规模的 Azure IIS7 应用程序,它必须这样做:
- 接收请求
- 将请求负载放入队列以进行解耦异步处理
- 保持与客户端的连接
- 等待异步进程完成的通知
- 回复客户
请注意,这些将是长时间运行的进程(30 秒到 5 分钟)。
如果我们在这里使用 Monitor.Wait(...),等待来自异步进程的对同一个 Web 应用程序的回调,以在我们调用 Monitor.Wait() 的对象上调用 Monitor.Pulse(...),这会有效地迅速造成线程饥饿吗?
如果是这样,如何减轻这种情况?这里有更好的模式来等待回调吗?例如,我们是否可以将 Response 对象放入线程安全的字典中,然后以某种方式让步,让回调代码锁定 Response 并继续响应客户端?如果是这样,怎么做?
此外,如果异步进程终止,并且从不调用回调,从而永远不会导致 Monitor.Pulse() 触发怎么办?我们的线程现在挂了吗?