Мне интересно, как на самом деле работает параллелизм в веб-приложении. Я прочитал несколько статей и, насколько я понимаю, несколько экземпляров HttpApplication будут работать одновременно. Теперь я создал простое веб-приложение для тестирования параллелизма и поместил в global.asax следующее:
protected void Application_BeginRequest(object sender, EventArgs e)
{
Response.Write("Request started: " + DateTime.Now);
System.Threading.Thread.Sleep(10000);
Response.Write("<br />");
Response.Write("Request ended: " + DateTime.Now);
Response.End();
}
Я ожидал, что если я перейду к корню веб-приложения на нескольких вкладках браузера почти одновременно, они будут запускаться и останавливаться одновременно. Однако похоже, что это не так. Время начала второй вкладки такое же, как время окончания первой вкладки. Затем я протестировал этот же код в httpmodule или default.aspx page_load и получил тот же результат.
Что здесь происходит? Почему запросы обслуживаются не параллельно?
Редактировать: Я размещаю свое понимание в основном на двух статьях:
http://msdn.microsoft.com/en-us/magazine/cc188942.aspx говорит: «Если несколько запросов, нацеленных на одно и то же приложение, поступают одновременно, будут использоваться несколько объектов HttpApplication».
а в http://www.code-magazine.com/article.aspx?quickid=0511061&page=5 есть пример страницы aspx, выполняющей в основном то, что я тестировал, с комментарием «Имитируйте медленный запрос, чтобы мы могли видеть несколько запросов бок о бок». рядом с вызовом Thread.Sleep
Возможно, я что-то совершенно не понимаю ... но что?
http://www.code-magazine.com/article.aspx?quickid=0511061&page=5





Почему бы вам не изменить образец для печати идентификатора потока? Это скажет вам, обслуживают ли запросы одновременно несколько потоков. Бьюсь об заклад, это так.
Хех. Проблема была в Google Chrome. Я открыл в нем две вкладки, и кажется, когда они указывают на один и тот же URL-адрес, запросы отправляются последовательно, один за другим!
Спасибо за идеи!
Каждый поступающий запрос направляется отдельному объекту HttpApplication. Объект HttpApplication создается с нуля или выделяется из пула. Максимальное количество создаваемых объектов HttpApplication ограничено максимальным количеством доступных потоков. В ASP.NET 1.x я думаю, что по умолчанию было 20 или около того. В ASP.NET 2.0 этот предел регулируется динамически.
Вам нужно будет создать достаточно запросов, чтобы исчерпать пул потоков ASP.NET, прежде чем ваше приложение начнет давать сбои.
Комментарий в статье «Код» означает не то, что его код является узким местом сервера, он использует его как способ увидеть состояние нескольких запросов бок о бок, таких как разные идентификаторы потока.
Спасибо, Кев, см. Мой ответ ... Я подумал, что происходит что-то странное!
Идентификатор потока время от времени меняется, но все равно каждый запрос запускается один за другим.