Подтвердить что ты не робот

BackgroundWorker поток в ASP.NET

Можно ли использовать поток BackGroundWorker в ASP.NET 2.0 для следующего сценария, чтобы пользователь в конце браузера не долго ждать?

Сценарий

  • Браузер запрашивает страницу, например SendEmails.aspx
  • Страница SendEmails.aspx создает поток BackgroundWorker и снабжает поток достаточным контекстом для создания и отправки писем.
  • Браузер получает ответ от ComposeAndSendEmails.aspx, говоря, что отправляются электронные письма.
  • Тем временем фоновый поток участвует в процессе создания и отправки электронных писем, которые могут занять некоторое значительное время.

Моя основная забота заключается в том, чтобы поддерживать поток BackgroundWorker, пытаясь отправить, скажем 50 писем, в то время как поток threadprocess для потока ASP.NET уже давно ушел.

4b9b3361

Ответ 1

Если вы не хотите использовать библиотеки AJAX, или обработка электронной почты ДЕЙСТВИТЕЛЬНО длинна и будет зависеть от стандартного запроса AJAX, вы можете использовать метод AsynchronousPostBack, который был "старым взломом" в .net 1.1 дней.

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

Когда ваш фоновый процесс будет завершен, он добавит немного "сделанного" флага в переменную базы данных/приложения/независимо. Когда ваша промежуточная страница обновляет себя, она обнаруживает этот флаг и автоматически перенаправляет пользователя на страницу "done".

Опять же, AJAX делает все это спорным, но если по какой-то причине у вас есть очень интенсивный и своевременный процесс, который должен осуществляться через Интернет, это решение будет работать для вас. Я нашел здесь хороший учебник , и там есть еще много.

Мне пришлось использовать такой процесс, когда мы работали над приложением типа "веб-регистрация", которое взаимодействовало с сторонним приложением, а их API импорта был ужасно медленным.

EDIT: GAH! Проклинайте вас Гузларом и вашими богоподобными способностями набрав 8 ^ D.

Ответ 2

Вам не нужно делать нитки с страниц ASP.NET. Любой поток, который работает долго, может быть убит, когда рабочий процесс перерабатывается. Вы не можете предсказать, когда это произойдет. Любые длительные процессы должны обрабатываться службой Windows. Вы можете запустить эти процессы, например, отбросив сообщение в MSMQ.

Ответ 3

ThreadPool.QueueUserWorkItem(delegateThatSendsEmails)

или на System.Net.Mail.SmtpServer используется метод SendAsync.

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

Ответ 4

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

Если вам нужно показать прогресс задачи, рассмотрите некоторые методы Ajax.

Ответ 5

Что вам нужно использовать для этого сценария, это Asynchronous Pages, функция, добавленная в ASP.NET 2.0

Асинхронные страницы предлагают аккуратный решение проблем, вызванных Запросы, связанные с I/O-привязкой. Обработка страницы начинается в потоке потока, но этот поток возвращается в поток пул после асинхронного ввода-вывода операция начинается в ответ на сигнал от ASP.NET. Когда завершение работы, захват ASP.NET другой поток из пула потоков и завершает обработку запроса. Масштабируемость увеличивается, потому что Thread-pool threads используются больше эффективно. Темы, которые в противном случае застрял, ожидая ввода/вывода теперь можно использовать для обслуживания другие запросы. Прямой бенефициарами являются запросы, которые не выполнять длительные операции ввода-вывода и поэтому входите и выходите из трубопровода быстро. Долго ждать в трубопровод имеют непропорционально негативное воздействие на выполнение таких запросов.

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

Ответ 6

Если вы хотите использовать многозадачность на странице ASP, вы можете использовать простую модель для потоковой передачи:

{
    System.Threading.Thread _thread = new Thread(new ThreadStart(Activity_DoWork));
    _thred.Start();
}
Activity_DoWork()
{
    /*Do some things...
}

Этот метод корректно работает с ASP-страницами. Страница ASP с BackgroundWorker не запустится, пока BackgroundWorker закончит.

Ответ 7

5 лет спустя, но проблемы одинаковы... Если вы хотите выполнить операции "огонь-и-забыть" из своего приложения и забыть обо всех трудностях, связанных с обработкой фоновой работы в приложениях ASP.NET, вы можете использовать http://hangfire.io.

  • Он не потеряет ваши рабочие места в процессе переработки, потому что он использует постоянное хранилище для хранения информации о фоновых заданиях.
  • Он автоматически повторяет ваши фоновые задания, которые были прерваны или не выполнены из-за исключения переходных процессов (ошибки подключения к SMTP-серверу).
  • Это позволяет легко отлаживать фоновые задания через встроенный веб-интерфейс.
  • Очень легко установить/настроить/использовать HangFire.

Существует также учебник Отправка почты в фоновом режиме с помощью ASP.NET MVC для использования HangFire с Postal.