我的架构涉及浏览器每 3 秒通过 ajax 轮询一次更新,我想将其更改为长轮询。
我希望有 1, 2.. {n} 个客户端长轮询,等待更新,并在服务器上发生一些事情以指示等待的客户端返回。我的第一个想法是使用EventWaitHandle
,如果我只想支持 1 个客户端,我可以轻松做到这一点。我只是有一个会阻止客户端,也许有超时,也许不是。无论哪种方式,an只允许我支持 1 个客户端(因为它只唤醒 1 个等待线程)并且我想要 n 个客户端。AutoResetEvent
WaitHandle
WaitOne
AutoResetEvent
我很确定我需要使用 a ,但我不确定何时调用它(唤醒线程时)。我应该只是在和之间的一些任意数量ManualResetEvent
WaitHandle
Reset
Set
Thread.Sleep
Set
Reset
吗?
在伪代码中,唤醒逻辑是
- 得到
ManualResetEventWaitHandle
- 称呼
Set
- 确保所有等待的客户端都已唤醒,同时防止新请求通过
- 现在打电话
Reset
,所有等待的客户都收到了他们的更新
这是我遇到困难的第 3 行。目前我正在折腾拥有一个LastTxID
让客户端/服务器维护并可能使用 2 个等待句柄的想法。然而,在我对这个实现发疯之前,我想在这里获得反馈,看看他们将如何实现唤醒逻辑。
编辑:假设我已经通过调整 IIS 或通过 WCF 或其他解决方案托管来解决与最大并发用户数相关的问题。我只想关注清醒的逻辑。