为什么在异步操作完成之前不执行同步操作?

时间:2010-11-29 02:57:21

标签: asp.net asp.net-mvc asp.net-mvc-2 asp.net-ajax comet

我正在ASP.NET MVC中实现Comet。我使用计时器在服务器中保留异步请求。当计时器在1分钟后过去并向客户端发送响应(以避免404错误),然后重新连接到异步控制器时,异步请求将完成。

我还希望在异步请求保持时执行一些同步操作,但问题是:

  • 当使用计时器执行并保持异步操作时,直到异步操作(Comet长期请求)完成后才会调用同步操作

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

我有一个子问题:

  • 实现Comet,使用计时器(经过几分钟后的响应)或线程(多次休眠线程后的响应)来保存异步请求;哪个更好?

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的答案 首先,为什么同步操作未执行同步操作因为会话请求块机制,Asp.net会话阻止请求以便所有请求将由一个甚至你使用Ajax异步调用的并发请求。解决方案是在控制器上禁用会话以保存长期请求。以下是详细说明:https://blogs.msdn.com/b/rickandy/archive/2009/12/17/session-less-mvc-controller.aspx
第二种,当执行持有长时间请求时,使用定时器和线程休眠并没有什么不同,因为Asp.net线程池实际上会创建新线程来跟踪已过去的时间并回调到您的定时器已用事件。它会减少线程池中服务请求的线程数,因为它会生成跟踪计时器事件的新线程。