Тема BackgroundWorker в ASP.NET - PullRequest
       37

Тема BackgroundWorker в ASP.NET

19 голосов
/ 12 сентября 2008

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

Сценарий

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

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

Ответы [ 7 ]

13 голосов
/ 12 сентября 2008

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

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

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

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

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

РЕДАКТИРОВАТЬ: ГАХ! Будь проклят Гузлар и твои богоподобные способности печатать 8 ^ D.

7 голосов
/ 12 сентября 2008

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

6 голосов
/ 12 сентября 2008
ThreadPool.QueueUserWorkItem(delegateThatSendsEmails)

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

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

2 голосов
/ 10 июня 2014

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

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

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

2 голосов
/ 10 января 2009

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

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

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

2 голосов
/ 12 сентября 2008

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

.

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

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

2 голосов
/ 12 сентября 2008

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

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

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