繁体   English   中英

我应该如何为ajax请求实现长轮询的C#服务器端部分?

[英]How should I implement the C# server side portion of long-polling for ajax requests?

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

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

我很确定我需要使用ManualResetEvent WaitHandle ,但是我不确定何时在Set它之后调用Reset (当唤醒线程时)。 我应该只是Thread.Sleep SetReset之间的任意数量?

在伪代码中,唤醒逻辑将是

  • 获取ManualResetEventWaitHandle
  • 呼叫Set
  • 确保所有等待的客户端都已醒来,同时防止新的请求通过
  • call现在Reset所有等待的客户端都已收到更新

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

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

一个想法,在伪代码中

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

我很想得到一些反馈

对这种方法的看法

  • 必须维护一个连接列表
  • 必须为{n}个客户端生成{n}等待句柄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM