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)我应该研究哪个主题?你知道一本好书吗?
谢谢
归档时间: |
|
查看次数: |
1560 次 |
最近记录: |