Длительный код в процессе asp.net

Например. мы этот код в коде формы asp.net:

private void btnSendEmails_OnClick()
{
    Send100000EmailsAndWaitForReplies();
}

Выполнение этого кода будет прекращено по причине тайм-аута. Для решения проблемы хотелось бы увидеть что-то вроде этого:

private void btnSendEmails_OnClick()
{
    var taskId = AsyncTask.Run( () =>  Send100000EmailsAndWaitForReplies() );
    // Store taskId for future task execution status checking.
}

И этот метод будет выполняться каким-то образом вне процесса w3wp.exe в специальной среде.

Кто-нибудь знает фреймворк / набор инструментов для решения таких проблем?

Обновлять: Метод отправки электронных писем - это только пример того, что я имею в виду. Фактически, у меня могло быть много функций, которые нужно было бы выполнить вне рабочего процесса asp.net.

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

Если вы можете жить в пределах 90-секундного ограничения по времени, вы можете использовать QueueBackgroundWorkItem. Другие варианты включают HangFire, Web Jobs и облачные сервисы Azure. См. Мой ответ ниже для более подробной информации.

RickAndMSFT 10.06.2014 22:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
8 806
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Один из вариантов - заставить задачу выполнить определенное количество писем, затем Response.Redirect обратно к себе и повторять, пока все ваши письма не будут отправлены.

Я могу придумать два возможных пути, по которым я пойду:

  1. Вы можете создать службу Windows, в которой размещен удаленный объект, и заставить ваше веб-приложение вызывать этот удаленный объект, чтобы гарантировать, что метод выполняется за пределами пространства процесса IIS.
  2. Вы можете настроить базу данных или MSMQ, в которую вы будете регистрировать запрос. Затем ваше веб-приложение может отслеживать статус запроса, чтобы впоследствии уведомить пользователя о его завершении. Я представляю себе службу, выполняющую запросы.

Server.ScriptTimeout = 360000000;

Вы можете использовать функцию отправки писем как службу. Отправьте ему запрос, и пусть он его обработает. Время от времени запрашивайте его статус. Если у вас есть контроль над сервером, вы можете установить службу Windows, которая, вероятно, будет идеальной для оптимальной обработки и управления сроком службы.

ASP.NET 2.0+ поддерживает концепцию асинхронных страниц. Добавьте на свою страницу директиву Async = "true".

Затем в Page_Load используйте делегаты BeginEventHandler и EndEventHandler, чтобы код выполнялся асинхронно в соответствующих «обработчиках».

<%@ Page Language = "C#" Async = "true" %>
<script runat = "server">

  protected void Page_Load(object sender, EventArgs e)
  {
    BeginEventHandler begin = new BeginEventHandler(BeginMethod);
    EndEventHandler  end = new EndEventHandler(EndMethod);

    AddOnPreRenderCompleteAsync(begin, end);
  }
</script>

Это обсуждалось в рамках других вопросов:

Многопоточность в asp.net

Поток BackgroundWorker в ASP.NET

Нет хорошего способа сделать это. Вам не нужны какие-либо длительные процессы в рабочем процессе ASP.NET, поскольку он может перезапуститься до того, как вы закончите.

Напишите службу Windows для работы в фоновом режиме, которая сделает всю работу за вас. Перетащите сообщения в MSMQ для запуска задач. Тогда они могут бегать столько, сколько захотят.

Как служба Windows могла узнать мои бизнес-объекты?

Ewerton 02.08.2011 23:11

Часто бывает невозможно запустить настраиваемую службу Windows, когда ваш сайт размещен у поставщика общего хостинга. Запуск отдельного потока, который вы переводите в спящий режим для запуска через регулярные промежутки времени, может быть несовместимым, поскольку IIS будет время от времени повторно использовать ваши потоки, и даже установка свойства выполнения сценария в файле cofig или через код не гарантирует, что ваш поток не убивают и не перерабатывают.

Я столкнулся с методом, основанным на истечении срока действия кеша, который, учитывая методы, доступные в службе общего хостинга, может быть самым безопасным, то есть наиболее последовательным вариантом. Эта статья объясняет это довольно хорошо и предоставляет класс очереди заданий, чтобы помочь управлять вашими запланированными заданиями в конце статьи, см. Его здесь - http://www.codeproject.com/KB/aspnet/ASPNETService.aspx

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

Если вы хотите выполнять фоновые задачи вне конвейера обработки запросов, рассмотрите возможность использования http://hangfire.io, он справляется со всеми трудностями и рисками фоновой обработки за вас, без необходимости установки дополнительных служб Windows (но их можно использовать, когда придет время ). Есть и руководство по отправке почты.

Ответ принят как подходящий
  1. QueueBackgroundWorkItem В моем примере показана отправка электронной почты.
  2. HangFire Открытый проект работает на виртуальном хостинге.
  3. В Azure вы можете использовать Веб-вакансии.
  4. В Azure, Облачные сервисы

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