3

我的架构涉及浏览器每 3 秒通过 ajax 轮询一次更新,我想将其更改为长轮询

我希望有 1, 2.. {n} 个客户端长轮询,等待更新,并在服务器上发生一些事情以指示等待的客户端返回。我的第一个想法是使用EventWaitHandle,如果我只想支持 1 个客户端,我可以轻松做到这一点。我只是有一个会阻止客户端,也许有超时,也许不是。无论哪种方式,an只允许我支持 1 个客户端(因为它只唤醒 1 个等待线程)并且我想要 n 个客户端。AutoResetEvent WaitHandleWaitOneAutoResetEvent

我很确定我需要使用 a ,但我不确定何时调用它(唤醒线程时)。我应该只是在和之间的一些任意数量ManualResetEvent WaitHandleResetSetThread.SleepSetReset吗?

在伪代码中,唤醒逻辑是

  • 得到ManualResetEventWaitHandle
  • 称呼Set
  • 确保所有等待的客户端都已唤醒,同时防止新请求通过
  • 现在打电话Reset,所有等待的客户都收到了他们的更新

这是我遇到困难的第 3 行。目前我正在折腾拥有一个LastTxID让客户端/服务器维护并可能使用 2 个等待句柄的想法。然而,在我对这个实现发疯之前,我想在这里获得反馈,看看他们将如何实现唤醒逻辑。

编辑:假设我已经通过调整 IIS 或通过 WCF 或其他解决方案托管来解决与最大并发用户数相关的问题。我只想关注清醒的逻辑。

4

1 回答 1

0

一个想法,用伪代码

  • 维护一个线程安全的连接 ID 列表,可能使用会话 ID
  • 为每个连接提供自己的 AutoResetEventWaitHandle
  • 以线程安全的方式,循环遍历这些等待句柄并在有更新时设置它们
  • 在会话结束时,以线程安全的方式,从列表中删除该连接/会话 ID

我很想得到一些关于这个的反馈

反对这种方法

  • 必须维护一个连接列表
  • 必须为 {n} 个客户端生成 {n} 个等待句柄
于 2010-04-28T15:57:21.933 回答