Многопоточность с ASP.NET и IIS - PullRequest
4 голосов
/ 17 ноября 2009

У нас есть веб-приложение, которое должно обрабатывать большой объем данных и отправлять сообщения в серию MSMQueues. Эта операция может занять более 10 минут, но мы хотим быстро получить ответ (состоящий из идентификатора). Поэтому мы внедрили систему, которая генерирует идентификатор и запускает процесс push в отдельном потоке, а затем возвращает идентификатор.

Это работает нормально, но наша единственная проблема - перезапуск IIS. Мы провели некоторое тестирование, и IISRESET убивает рабочий поток, даже если наш поток не завершил работу с очередями сообщений. В идеале мы хотели бы перезапустить IIS таким образом, чтобы наш поток продолжал работать до тех пор, пока он не закончил.

Передача переключателя / NOFORCE в IISRESET, похоже, не имеет никакого эффекта.

Кто-нибудь знает, как мы могли бы гарантировать, что IISRESET ждет, пока наш рабочий поток завершит свою обработку, прежде чем перезапускать IIS.

Спасибо

Steve

Ответы [ 2 ]

7 голосов
/ 17 ноября 2009

IIS - это не то место, где вы должны выполнять долго выполняющиеся задачи, такие как эта. У нас очень похожие требования, когда мы должны инициировать длительные задачи обслуживания на наших веб-серверах. Эти задания запускаются через веб-службу, а затем передаются службе Windows. Пока служба Windows еще жива, мы можем запрашивать задачи для их выполнения. Это означает, что наши долгосрочные задачи могут пережить IISRESET.

IISRESET в значительной степени все или ничего и нечувствителен к потокам .NET, которые вы запускаете в приложении ASP.NET.

Переключатель /NOFORCE указывает IISRESET не принудительно сбрасывать IIS, если служба не отвечает в течение одной минуты. IISRESET не знает ваших приложений .NET и убьет ваше приложение мертвым.

Обновление:

Чтобы ответить на вопрос в комментарии Стива: «Как вы рекомендуете передавать данные в Службу Windows из IIS?». Что нужно сделать, это разместить приложение .NET Remoting или WCF в службе Windows и передавать данные / сообщения с помощью именованных каналов (только если требуются вызовы внутри машины).

0 голосов
/ 17 ноября 2009

Я бы посоветовал, что если вам не нужен ответ из потока, который я принимаю, вы не делаете этого, чтобы вы поставили его в очередь в своей базе данных, а затем создали сервис для обработки очереди. После повторного запроса создайте свой уникальный ключ и передайте его в БД для последующего получения службой. Затем служба может обрабатывать данные, не беспокоясь о том, что ваши потоки будут убиты, а также вы сможете лучше отслеживать трафик / нагрузку с помощью службы.

У нас есть механизм переноса, который работает по аналогичному принципу, и он делает подобные вещи намного проще в долгосрочной перспективе.

Если вам нужно отчитаться о данных, тогда вам просто нужно дождаться готового отчета, или данные будут сохранены в БД, а затем приложение asp.net может взять на себя все остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...