Попробуйте открыть следующую страницу в двух разных вкладках в вашем браузере. нажмите кнопку обновления, чтобы избежать получения страницы из кэша браузера:
protected void Page_Load(object sender, EventArgs e)
{
Thread.Sleep(10000);
Response.Write(DateTime.Now.ToString());
}
Как видите, кажется, что для каждого запроса создается поток, и они не ожидают друг друга, поскольку блокировка не получена.
Теперь создайте следующие страницы, и GlobalCustomClass
GlobalCustomClass
public class GlobalCustomClass
{
public static string GlobalVariable
{
get;
set;
}
}
Default.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);
}
Page2.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(DateTime.Now.ToString());
Response.Write("<br />");
GlobalCustomClass.GlobalVariable = "Page2";
Response.Write(GlobalCustomClass.GlobalVariable);
}
Обновить страницу по умолчанию, и до истечения 10 секунд обновить страницу 2 ... Default.aspx отображает «страницу 2». Да, это не потокобезопасно.
Теперь попробуйте это, откройте следующую страницу в двух вкладках браузера:
protected void Page_Load(object sender, EventArgs e)
{
Session["x"] = "ABC";
Thread.Sleep(10000);
Response.Write(DateTime.Now.ToString());
}
Теперь кажется, что первый поток блокируется на объекте сеанса, а другой должен ждать целых 10 секунд !!
Теперь попробуйте Первый случай, но поместите Global.ascx в проект ... и скажите что, первый поток блокируется на чем-то !!!!!
В реальном приложении обычно используется глобальные переменные состояния, которые требуют безопасности потоков, например, Sessions.
Если у вас есть Backend-приложение, содержащее отчет, для визуализации которого требуется 30 секунд. и если 60 пользователей откроют этот отчет, то пользователь с номером 61 будет ждать полчаса, пока страница загрузится в его браузер !! Это типичная нить голода !! и меня, вероятно, уволят: (
1) Каждый пользователь ждет, пока другой не закончит свой запрос. это должно сделать любую тяжелую страницу проблемой. потому что это может сделать целое веб-приложение отзывчивым. Принимаю
2) Как исправить эту ситуацию?
3) По какой теме я должен исследовать это? Вы знаете хорошую книгу?
Спасибо