关于工作进程线程的困惑

Cos*_*sta 0 architecture asp.net performance application-pool thread-safety

尝试在浏览器的两个不同选项卡中打开以下页面。点击刷新按钮以避免从浏览器缓存中获取页面:

    protected void Page_Load(object sender, EventArgs e)
    {
        Thread.Sleep(10000);
        Response.Write(DateTime.Now.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,似乎为每个请求创建了一个线程,并且它们没有相互等待,也没有获取锁。

现在创建以下页面,以及 GlobalCustomClass

全局自定义类

public class GlobalCustomClass
    {
        public static string GlobalVariable
        {
            get;
            set;
        }
    }
Run Code Online (Sandbox Code Playgroud)

默认.aspx

protected void Page_Load(object sender, EventArgs e)
        {
            GlobalCustomClass.GlobalVariable = "Default page";
            Thread.Sleep(10000);
            Response.Write(DateTime.Now.ToString());
            Response.Write("<br />");
            Response.Write(GlobalCustomClass.GlobalVariable);
        }
Run Code Online (Sandbox Code Playgroud)

页面2.aspx

 protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write(DateTime.Now.ToString());
            Response.Write("<br />");
            GlobalCustomClass.GlobalVariable = "Page2";
            Response.Write(GlobalCustomClass.GlobalVariable);

        }
Run Code Online (Sandbox Code Playgroud)

刷新默认页面,在 10 秒过去之前,刷新 Page2....Default.aspx 正在呈现“Page2”。是的,它不是线程安全的。

现在试试这个,在两个浏览器选项卡中打开以下页面:

    protected void Page_Load(object sender, EventArgs e)
    {
         Session["x"] = "ABC";
         Thread.Sleep(10000);
         Response.Write(DateTime.Now.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

现在看来第一个线程锁定了会话对象,另一个要等待整整 10 秒!!

现在尝试第一种情况,但将 Global.ascx 放在项目中……然后说,第一个线程锁定了某些东西!!!!!!

在实际应用中,访问像Sessions这样需要线程安全的全局状态变量是很常见的。

如果您的后端应用程序包含需要 30 秒呈现的报告。如果有 60 个用户打开该报告,那么用户编号 61 将等待半小时,直到页面加载到他的浏览器中!!这是典型的线程饥饿!!我可能会被解雇:(

1)每个用户都在等待另一个用户完成他的请求。这应该会使任何重页成为问题。因为它可以使整个 web 应用程序响应。 同意?

2)如何解决这种情况?

3)我应该研究哪个主题?你知道一本好书吗?

谢谢

小智 5

如果您需要来自同一用户的并发请求,您可以

  1. 禁用会话状态或
  2. 在页面指令中将会话设置为只读。

显然,如果会话状态是只读的,你不能写入它,但你仍然可以读取它来找出用户是谁,等等。