Ashx+ajax怎么实现long-polling

xiaoyaolei01 2017-02-06 02:48:47
想实现即时获取信息,查询百度,有人使用Thread.Sleep()的方式循环信息队列,当有新消息时往前端响应,再次进入循环。如此反复。但是本菜鸟测试后发现,用了这个循环,整个系统的ashx都无法访问,系统阻塞在这个循环里面了,我本以为这个应该是多线程的,而且即使ashx是单线程,但是不同ashx总不会只允许单个访问吧,难道IIS是单线程,不可能吧,我晕了,求解。
...全文
473 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
robake 2017-02-08
  • 打赏
  • 举报
回复
贴上代码瞅瞅
Pigeon汪 2017-02-07
  • 打赏
  • 举报
回复
可以考虑使用WebSocket
xiaoyaolei01 2017-02-06
  • 打赏
  • 举报
回复
引用 12 楼 diaodiaop 的回复:
comet么?? 我发过帖子你可以看下
comet我怎么看都是ajax,不知道有什么区别,本菜鸟愚钝,搞不懂!
by_封爱 2017-02-06
  • 打赏
  • 举报
回复
comet么?? 我发过帖子你可以看下
xiaoyaolei01 2017-02-06
  • 打赏
  • 举报
回复
引用 9 楼 closurer 的回复:
ashx 有一个是否可以重用对象的属性。 这种解决方案不是坑,其实很常用的。
IsReusable又涉及到线程安全问题,凌乱了,崩溃中~~~
xiaoyaolei01 2017-02-06
  • 打赏
  • 举报
回复
引用 9 楼 closurer 的回复:
ashx 有一个是否可以重用对象的属性。 这种解决方案不是坑,其实很常用的。
设置成true还是无响应 是不是我打开的方式不对
闭包客 2017-02-06
  • 打赏
  • 举报
回复
ashx 有一个是否可以重用对象的属性。 这种解决方案不是坑,其实很常用的。
xiaoyaolei01 2017-02-06
  • 打赏
  • 举报
回复
引用 7 楼 yhb417 的回复:
你的这个ashx后台是否使用了Session之类的东西,写Session时,Asp.net会阻塞请求,像你这种long-polling用的不当导致程序变成单线程
是用了Session、cache、还有读取webconfig,但却是要用到这些东西,这怎么办?
修改一下昵称 2017-02-06
  • 打赏
  • 举报
回复
你的这个ashx后台是否使用了Session之类的东西,写Session时,Asp.net会阻塞请求,像你这种long-polling用的不当导致程序变成单线程
xiaoyaolei01 2017-02-06
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
你如果不是“延迟5秒钟才轮询服务器”,比如说你是延迟5毫秒就轮询服务器一次(有些人就是会把5000误写为5),那这样的客户端在搞死服务器上就是“拼了”,就是恶意攻击服务器了。
是不是ashx就不可能实现long-polling?
xiaoyaolei01 2017-02-06
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
你如果不是“延迟5秒钟才轮询服务器”,比如说你是延迟5毫秒就轮询服务器一次(有些人就是会把5000误写为5),那这样的客户端在搞死服务器上就是“拼了”,就是恶意攻击服务器了。
我要做一个收发信息的系统,也相当于即时通讯,因为收发必须及时通知。一开始就是简单的轮询,脚本设置定时查询服务器的缓存数据,但就是怕把服务器搞死,所以整整延迟到了5分钟,但也就意味着不能及时通知,系统就近乎没有意义 了,然后查了 查即时通讯,里面有介绍到这个long-polling,然后就入坑了。
  • 打赏
  • 举报
回复
你如果不是“延迟5秒钟才轮询服务器”,比如说你是延迟5毫秒就轮询服务器一次(有些人就是会把5000误写为5),那这样的客户端在搞死服务器上就是“拼了”,就是恶意攻击服务器了。
xiaoyaolei01 2017-02-06
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
不是循环,是CPU被这类线程任务“忙死”了,别的并发的重要事情根本干不了。 比如说有1000个客户端,当有消息的时候才通知客户端,那么任务操作是1。并且任务都是瞬间即时通讯到客户端的。 现在假设每个客户端每隔5秒钟轮询一次,那么就是说服务器端每隔5秒就至少要处理1000个无实际结果意义的巨大查询,每秒钟就要处理200个。而客户端还是要延迟5秒,用户体验很差(你一旦手工测试起来就会发现,延迟五秒的测试体验,看上去非常可笑)。 所以轮询只是不得已的办法,只是“玩儿玩儿”而已。根本不是及时网络通讯技术。
那怎么办???
  • 打赏
  • 举报
回复
至少从 asp.net 3.0 版本以后,asp.net 响应客户端请求就是线程的。 在线程并发方面并没有问题。问题是这样滥用了线程,一上线就把服务器搞死机了。
  • 打赏
  • 举报
回复
不是循环,是CPU被这类线程任务“忙死”了,别的并发的重要事情根本干不了。 比如说有1000个客户端,当有消息的时候才通知客户端,那么任务操作是1。并且任务都是瞬间即时通讯到客户端的。 现在假设每个客户端每隔5秒钟轮询一次,那么就是说服务器端每隔5秒就至少要处理1000个无实际结果意义的巨大查询,每秒钟就要处理200个。而客户端还是要延迟5秒,用户体验很差(你一旦手工测试起来就会发现,延迟五秒的测试体验,看上去非常可笑)。 所以轮询只是不得已的办法,只是“玩儿玩儿”而已。根本不是及时网络通讯技术。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧