Есть ли какие-то неочевидные опасности в использовании потоков в ASP.NET? - PullRequest
7 голосов
/ 22 октября 2010

Это что-то вроде родственного вопроса к этому вопросу программистов .

Вкратце, мы рассмотрим, как правильно продвигать некоторую работу, которая была связана с пользовательскими запросами, в фоновом режиме "«.Связанный вопрос дал мне много идей, если мы пойдем по пути обслуживания, но на самом деле не предоставил никаких убедительных аргументов относительно того, почему именно мы должны.

Я признаю, что для меня способностьсделать моральный эквивалент

WorkQueue.Push(delegate(object context) { ... });

действительно убедительно, поэтому, если это просто немного сложно (а не по своей сути неработоспособно), я склонен придерживаться подхода фонового потока.

Итак, проблемы с фоновыми потоками, о которых я знаю (в контексте AppPool):

  • Они могут умереть в любое время из-за перезапуска AppPool
    • Решение:отслеживать, когда задача выполняется, поэтому она может быть перезапущена * в случае необходимости нового потока
  • ThreadPool используется для ответа на входящие HTTP-запросыиспользование IIS
    • Решение: создайте наш собственный пул потоков, также ограничив число потоков.

Мой вопрос: что мне не хватает, если что? Что еще может пойти не так? С фоновыми потоками в ASP.NET?

* Задание, о котором идет речь, уже безопасно перезапускать, так что это не проблема.
ǂ Предположим, мы не делаем ничего действительно глупого, например, бросаем исключения в фоновые потоки.

Ответы [ 4 ]

3 голосов
/ 22 октября 2010

Я бы не стал запускать потоки из-за вашего IIS AppDomain для StackOverflow.У меня нет веских доказательств в поддержку того, что я собираюсь сказать, но работая с IIS в течение 10 лет, я знаю, что это работает лучше, когда это единственная игра в городе.

Существует также альтернатива, я знаю, это будет своего рода взлет моего ответа в потоке программистов.Но, насколько я понимаю, у вас уже есть решение, которое работает, поддерживая работу над пользовательскими запросами.Почему бы не использовать этот код, а только запускать его при вызове специального внутреннего API.Затем используйте Task Scheduler для вызова команды CURL, которая вызывает этот API каждые 30 секунд или около того, чтобы запустить задачи.Таким образом, вы позволяете IIS обрабатывать потоки, а ваш код обрабатывает то, что он уже делает легко.

2 голосов
/ 22 октября 2010

Одна опасность, с которой я столкнулся лично, это CallContext. Мы использовали CallContext для установки идентификационных данных пользователя, потому что один и тот же код был распространен в нашем веб-приложении и наших прикладных службах на основе .NET Remoting (который предназначен для использования CallContext для хранения данных, относящихся к вызову) - поэтому мы не использовали HttpContext.

Мы заметили, что иногда новый запрос в CallContext заканчивается ненулевым идентификатором. Другими словами, ASP .NET не обнулял данные, хранящиеся в CallContext, между запросами ... и, таким образом, неаутентифицированный пользователь мог попасть в приложение, если бы он выбрал поток, в котором все еще был CallContext, содержащий проверенную информацию о личности пользователя. 1003 *

1 голос
/ 22 октября 2010

Позвольте мне рассказать вам о неочевидной опасности:)

Я использовал потоки для сбора. Обновите несколько RSS-каналов в своей базе данных для веб-сайта, который я размещал на GoDaddy. Потоки работали нормально (если они были прерваны, они будут перезапущены автоматически из-за некоторых проверок, которые я встроил в некоторые веб-страницы).

Это работало превосходно, и я был очень счастлив, пока GoDaddy (мой хозяин тогда) сначала не начал убивать потоки, а затем полностью их заблокировал. Так что мое приложение только что умерло!

Если это не было неочевидным, то что?

0 голосов
/ 22 октября 2010

Возможно, вы слишком усложняете свою архитектуру, не получая никаких преимуществ.

Ваша программа будет дороже в написании, более дорогой в обслуживании и с большей вероятностью будет иметь ошибки

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