2010-11-29 185 views
0

我在ASP.NET MVC中实现Comet。我使用了一个定时器来保持服务器中的异步请求。当计时器在1分钟后过去并向客户端发送响应(以避免404错误)并重新连接到异步控制器时,异步请求将完成。为什么在异步操作完成之前不会执行同步操作?

我也想执行而异步请求,拿着一些同步动作,但问题是:

  • 当被执行,通过使用定时器保持一个异步操作,同步动作不叫直到异步动作(Comet long-live request)完成

我用Firefox 3.6多次测试过,但结果总是一样的;这太奇怪了。你知道为什么吗?

我有一个子问题:

  • 为了实现彗星,使用计时器(响应之后一些分钟的经过)或螺纹(几个时间睡觉螺纹后响应)来保存异步请求;哪个更好?
+0

给我看钱...呃源代码。 – 2010-11-29 03:12:58

回答

0

我找到了我的问题的答案。
首先,为什么同步操作未被执行,而异步操作持有,因为会话请求块机制,Asp.net会话块请求使得所有请求都将被逐个处理,即使您使用Ajax并发请求异步呼叫。并且解决方案是在要控制长时间请求的控制器上禁用会话。这里是详细的解释:https://blogs.msdn.com/b/rickandy/archive/2009/12/17/session-less-mvc-controller.aspx
第二,当执行持有长时间请求时,使用定时器和线程休眠并不不同,因为Asp.net线程池本质上会创建新的线程来跟踪已过去的时间并回调到您的定时器已用完事件。它会减少线程池中服务请求的线程数,因为它生成了新线程来跟踪定时器事件。