IIS, конвейер Asp.NET и параллелизм - PullRequest
2 голосов
/ 21 ноября 2008

Мне интересно, как на самом деле работает параллелизм в веб-приложении. Я прочитал несколько статей, и, насколько я понимаю, несколько экземпляров 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 call

Возможно, я что-то совершенно не понимаю ... но что?

http://www.code -magazine.com / article.aspx? Quickid = 0511061 & страница = 5

Ответы [ 3 ]

3 голосов
/ 21 ноября 2008

Хех. Проблема была в Google Chrome. Я открыл в нем две вкладки, и кажется, что когда они указывают на один и тот же URL, запросы отправляются последовательно, одна за другой завершена!

Спасибо за идеи, хотя!

3 голосов
/ 21 ноября 2008

Каждый поступающий запрос направляется в отдельный объект HttpApplication. Объект HttpApplication либо создается с нуля, либо выделяется из пула. Максимальное количество создаваемых объектов HttpApplication ограничено максимальным количеством доступных потоков. В ASP.NET 1.x я думаю, что по умолчанию было 20 или около того. В ASP.NET 2.0 этот предел управляется динамически.

Вам нужно создать достаточно запросов, чтобы исчерпать пул потоков ASP.NET, прежде чем приложение начнет работать.

Что означает комментарий в статье «Код», так это то, что его код не является узким местом на сервере, он использует его как способ видеть состояние нескольких запросов рядом, таких как разные идентификаторы потоков.

1 голос
/ 21 ноября 2008

Почему бы вам не изменить образец для печати идентификатора нити? Это скажет вам, если несколько потоков обслуживают запросы одновременно. Могу поспорить, что это так.

...