【问题标题】:IIS 6/7 Threading - Long running aspx page keeps other aspx pages from loadingIIS 6/7 线程 - 长时间运行的 aspx 页面使其他 aspx 页面无法加载
【发布时间】:2010-10-11 22:58:17
【问题描述】:

我编写了一个测试页面,该页面在页面加载时调用的方法中完成了一系列繁忙的工作。我现在的这个过程大约需要 12 秒。

如果我在第一个长时间运行的页面正在加载时尝试加载另一个页面,第二个页面除了写出一个 hello world 之外什么都不做,它不会加载直到第一个长时间运行的页面完成。

为什么会这样?我认为 IIS 将能够处理多个并发连接,一个长时间运行的页面会阻止应用程序中的所有其他页面加载似乎很疯狂。我一定是遗漏了什么或者不明白 IIS 是如何工作的。

我认为多个独立的请求会在不同的线程上产生。只有当请求完全来自不同的会话时才会出现这种情况?来自单个会话的所有请求是否都绑定到单个线程?

bd

【问题讨论】:

  • 这是在生产中还是在您的开发电脑上发生的?您是否将调试器附加到工作进程?
  • 我们运行 IIS 6 的 Stage 服务器和我在 Server 2008 R2 上运行 IIS 7 的本地计算机似乎都表现出这种行为。

标签: asp.net iis iis-7 iis-6 asp.net-2.0


【解决方案1】:

您需要关闭 sessionState...如果会话处于打开状态,则任何后续请求都在等待前一个线程完成,以便继续该特定会话。

所以关闭会话,它不需要等待任何以前的会话。

在 web.config 中放置

<system.web>
    <sessionState mode="Off" />
</system.web>

现在您应该同时处理这些请求。

【讨论】:

  • 谢谢它对我有用,但你能解释一下吗?\
【解决方案2】:

我也遇到了这个问题,对我来说,这是 ASP.NET 的会话功能。基本上,如果您启用了会话,则每个请求都将按照每个用户到达的顺序返回。

尝试使用 2 种不同的浏览器,对我来说它不再被阻止。这是一个类似的问题:

IIS 5.1 on XP Classic ASP appears to be in single threaded mode

【讨论】:

    【解决方案3】:

    这是一个线程问题。虽然 IIS 可以同时处理多个连接,但 ASP.NET 默认配置为单线程模式。

    微软的这个选择是为了防止 dummy 开发人员犯下常见的并发错误。 Mono 的 ASP.NET 不会显示此行为,如果您在没有事先锁定的情况下访问共享资源,您可能会... f...您知道 ;) 被黄页警告。

    我不记得确切的过程,但在您网站的属性中,您可以选择应用程序池以及线程数。我亲眼看到IIS6默认设置为1。

    如果找不到,请告诉我,明天我会在实验室中查看我的开发服务器。

    希望能有所帮助。

    【讨论】:

    • 我查看了 IIS 6 和 7,但找不到威胁计数属性,只是进程数的条目。我做了一些研究,似乎您可以使用几个 .config 文件配置线程,但我不确定这是否能解决我的问题,因为每个进程的线程默认值是 10-40。
    • 添加线程确实可以解决您的问题。尝试添加进程,看看它是否工作相同......
    • 但问题是每个进程的线程的默认值不是 1。所以问题不是每个进程的线程总数。由于某种原因,多个请求就像在同一个线程上处理一样,这就是问题所在。我不知道这是为什么。单个会话的所有请求是否在 1 个且仅一个线程上处理?不了解 IIS 如何在后台工作的更多信息,这似乎是我对正在发生的事情的最佳猜测。添加进程“网络花园”完全是一个不同的功能,需要我将会话存储在进程之外,对于一个简单的应用程序来说太过分了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多