【问题标题】:Why is my ASP.NET site acting single threaded?为什么我的 ASP.NET 站点是单线程的?
【发布时间】:2014-06-10 19:13:29
【问题描述】:

我有一个在 IIS 中运行的 ASP.NET 站点,我注意到如果一个页面很慢,它似乎运行速度很慢,所以我设置了一个测试来查看它是否像单线程一样运行(即,如果一页请求正在运行,所有其他请求都必须等待)。我创建了一个非常简单的页面(没有母版页,只有默认的 aspx 代码,除了我添加了一个 Literal 来转储调试代码),其中的代码读取当前时间,休眠 10 秒,然后退出,如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    DateTime now = DateTime.Now;
    System.Threading.Thread.Sleep(10000);         
    Literal1.Text = now.ToShortDateString() + " " + now.ToShortTimeString() + " " + now.Second + ":" + now.Millisecond;
}

然后我同时在两个不同的选项卡中打开该页面。每个选项卡上的时间戳几乎正好相隔 10 秒,这在我看来意味着第二个页面请求被阻止并等待第一个页面请求完成后再运行。

我尝试注释掉 web.config 中的所有 http 模块并禁用 Global.asax 中的所有代码,但我仍然看到这个问题。

【问题讨论】:

  • 您使用的是哪个版本的 IIS?您可能希望确保未打开服务器端调试,如下所述:stackoverflow.com/questions/587420/…
  • 尝试禁用会话状态。可能存在会话锁定。尝试不同的浏览器有什么不同吗?
  • 你不会在开发服务器上尝试这个,对吧?因为该服务器可能是单线程的,但 IIS 不是。
  • 您是否尝试过使用两种不同的网络浏览器而不是标签?您的浏览器可能会共享连接,因此在发送下一个请求之前等待响应。
  • Alex,我正在使用 Visual Studio,但项目设置为使用 IIS,而不是内置 Web 服务器。

标签: c# asp.net multithreading


【解决方案1】:

这听起来像是会话状态问题。

对 ASP.NET 会话状态的访问是每个会话独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一个会话发出两个并发请求(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。 [...]

来源:ASP.Net Session State Overview

尝试在 web.config 中禁用会话状态(或将其标记为只读)以确认这确实是问题所在,或使用两个不同的浏览器(获取不同的会话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2013-07-31
    • 2019-02-22
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多