Поток BackgroundWorker в ASP.NET

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

Сценарий

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

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

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

Darren Kopp 12.09.2008 03:14

подробнее здесь codeproject.com/KB/aspnet/ASPNETService.aspx

Darren Kopp 12.09.2008 03:16

QueueBackgroundWorkItem отлично подходит для отправки электронных писем. См. blogs.msdn.com/b/webdev/archive/2014/06/04/… Для более надежного механизма фоновых заданий см. Quartz.NET и HangFire. Если вы работаете в Azure, используйте веб-задания или облачные службы.

RickAndMSFT 20.08.2014 04:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
3
22 610
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

ThreadPool.QueueUserWorkItem(delegateThatSendsEmails)

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

Обновлено: ГАХ! Прокляни тебя, Гузлар, и твои богоподобные печатные способности 8 ^ D.

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

Это часто невозможно в размещенной среде. Тогда трюк с удалением кеша лучше всего подходит для меня.

dariol 25.09.2009 19:52

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

Asynchronous pages offer a neat solution to the problems caused by I/O-bound requests. Page processing begins on a thread-pool thread, but that thread is returned to the thread pool once an asynchronous I/O operation begins in response to a signal from ASP.NET. When the operation completes, ASP.NET grabs another thread from the thread pool and finishes processing the request. Scalability increases because thread-pool threads are used more efficiently. Threads that would otherwise be stuck waiting for I/O to complete can now be used to service other requests. The direct beneficiaries are requests that don't perform lengthy I/O operations and can therefore get in and out of the pipeline quickly. Long waits to get into the pipeline have a disproportionately negative impact on the performance of such requests.

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

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

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

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

если я делаю бесконечное время внутри Activity_DoWork. Поток все еще работает после перезапуска рабочего процесса?

Ewerton 02.08.2011 23:04

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

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

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

Другие вопросы по теме