Совместное использование переменных между страницей asp.net и фоновым потоком, созданным страницей - PullRequest
2 голосов
/ 27 мая 2011

У меня долгое время выполнялась задача в моем веб-приложении asp.net, и поэтому я запускаю эту задачу в новом потоке и постоянно опрашиваю, чтобы проверить состояние потока (используя элемент управления тикером, который тикает каждые 5 секунд и выполняет обратную передачу на сервер и проверяет состояние потока). Я использовал Session State для разделения переменных между потоком и страницей. Но я узнал, что это плохая практика для доступа к сеансу из фонового потока. Каков наилучший способ обмена переменными между потоком и страницей asp.net, создавшей этот поток?

Ответы [ 2 ]

1 голос
/ 27 мая 2011

Я не вижу проблемы с использованием Session - это в основном многопоточный словарь . Возможно, вам нужно убедиться, что ваш фоновый поток блокируется SyncRoot ; класс Page делает это автоматически.

Конечно, есть и другие варианты - статические переменные (но затем вы сталкиваетесь с проблемами в AppDomain) или внеполосные механизмы (то, чем является Session), такие как БД или служба обмена сообщениями. Если, конечно, у вас нет других потребностей в этих технологиях, Session, вероятно, будет самым простым.

Несколько предостережений, о которых я могу подумать:

  • Если время сеанса истекает, что происходит при записи в него из фонового потока? Исключение? Поддерживает это?
  • Как вы обнаруживаете, что фоновый поток вышел ненормально? Сохранить поток в сеансе?
  • Что произойдет с Session, если в фоновом потоке есть необработанное исключение *1019*?
1 голос
/ 27 мая 2011

Это не прямой ответ на ваш вопрос, а предложение использовать отдельный сервис WCF для длительных заданий.Ваш веб-сервер действительно занят работой над длинной задачей, которая, как я полагаю, использует много ресурсов процессора.

Ожидаемые проблемы

  • Общая производительность веб-сервера упадет
  • Вы не сможете масштабировать такое решение

В качестве альтернативы рассмотрите возможность размещения длительной логики в службе WCF.Вы можете запустить и проверить статус задания, выполнив простой AJAX-запрос с идентификатором задания.Каждое задание может быть запущено в отдельном потоке, и результат / статус сохраняются в запрашиваемом хранилище.

...