Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« : 27-04-2006 10:05 » |
|
Положим, имеется у пользователя в браузере много окошек одного и того же web-приложения, только разных его частей. Приложение берём ASP.NET (Framework 1.1), сервер IIS. Положим, имеем не очень быструю сеть, в которой скорость прохождения запросов не велика.
Положим, возникла задача пользователю сделать в разных окошках множество действий примерно в одно и то же время, и по завершении работы произвести submit форм в нескольких окошках.
Из-за тормозов сети заранее нельзя сказать, в какой последовательности запросы попадут на сервер.
Так как каждая форма в каждом окошке - есть отдельный объект System.Web.UI.Page, он обрабатывается движком ASP.NET.
Положим, необходимо произвести асинхронную обработку запросов так, чтобы некоторая часть запросов обработалась до некоторой другой части запросов. Так как порядок попадания запросов на сервер не известен, нужен механизм синхронизации. И вот здесь начинается вопрос.
Я полагал, что движок ASP.NET (а может IIS) обрабатывает запросы в разных потоках, поэтому торможение одного из потоков не должно вешать всю систему.
Для реализации синхронизации запросов я ввёл общий объект, хранимый в сессии, к которому имеет доступ каждая форма. В этом объекте хранится множество System.Threading.ManualResetEvent объектов - по одному объекту на каждую форму. Каждая форма, завершая обработку, устанавливает событие. Имеется общая форма, задачей которой является обобщение результатов работы всех прочих форм. Эта форма использует функцию System.Threading.WaitHandle.WaitAll, в которой висит до установки всех событий, а затем генерирует результирующую форму, выдаваемую пользователю.
Но эксперименты показывают, что движок ASP.NET выполняет запросы последовательно, по мере поступления, т.е. в рамках одной сессии один запрос в один момент времени. Поэтому, если в начале результирующая форма повиснет на WaitAll, выполнение всех прочих запросов также не будет выполняться.
Вопросы такие:
1) Как на самом деле происходит обработка запросов в ASP.NET. 2) Возможна ли организация параллельной обработки форм? 3) Может быть описанная задача решается каким-нибудь другим методом?
P.S. Ограничение обсуждения: предложения по пересмотру пользовательского интерфейса и перестроению форм не рассматриваются. Меня интересует исключительно вопрос параллелизма обработки запросов, а не UI.
|