【问题标题】:Why wasn't the synchronous action executed until the asynchronous action completed?为什么异步操作完成后才执行同步操作?
【发布时间】:2010-11-29 02:57:20
【问题描述】:

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

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

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

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

我有一个子问题:

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

【问题讨论】:

  • 给我钱...呃...源代码。
  • 我会为你展示一些来源

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


【解决方案1】:

我找到了问题的答案。
首先,同步动作在异步动作保持时没有执行的原因是因为会话请求阻塞机制,Asp.net会话阻塞请求,以便所有请求都将被处理即使您使用 Ajax 异步调用的并发请求也是如此。解决方案是在您想要保持长期请求的控制器上禁用会话。这里是详细解释:https://blogs.msdn.com/b/rickandy/archive/2009/12/17/session-less-mvc-controller.aspx
第二,当执行保持长寿命请求时,使用定时器和线程休眠并没有什么不同,因为 Asp.net 线程池本质上会创建新线程来跟踪时间流逝并回调您的定时器流逝事件。它将减少线程池中为请求提供服务的线程数,因为它产生了新的线程来跟踪计时器事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多