Например. мы этот код в коде формы 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.
Например. этот момент очень важен для приложения, которое собирает данные из пары сторонних сервисов, что-то с ними делает и отправляет обратно в другой сервис.





Один из вариантов - заставить задачу выполнить определенное количество писем, затем Response.Redirect обратно к себе и повторять, пока все ваши письма не будут отправлены.
Я могу придумать два возможных пути, по которым я пойду:
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>
Это обсуждалось в рамках других вопросов:
Поток BackgroundWorker в ASP.NET
Нет хорошего способа сделать это. Вам не нужны какие-либо длительные процессы в рабочем процессе ASP.NET, поскольку он может перезапуститься до того, как вы закончите.
Напишите службу Windows для работы в фоновом режиме, которая сделает всю работу за вас. Перетащите сообщения в MSMQ для запуска задач. Тогда они могут бегать столько, сколько захотят.
Как служба Windows могла узнать мои бизнес-объекты?
Часто бывает невозможно запустить настраиваемую службу Windows, когда ваш сайт размещен у поставщика общего хостинга. Запуск отдельного потока, который вы переводите в спящий режим для запуска через регулярные промежутки времени, может быть несовместимым, поскольку IIS будет время от времени повторно использовать ваши потоки, и даже установка свойства выполнения сценария в файле cofig или через код не гарантирует, что ваш поток не убивают и не перерабатывают.
Я столкнулся с методом, основанным на истечении срока действия кеша, который, учитывая методы, доступные в службе общего хостинга, может быть самым безопасным, то есть наиболее последовательным вариантом. Эта статья объясняет это довольно хорошо и предоставляет класс очереди заданий, чтобы помочь управлять вашими запланированными заданиями в конце статьи, см. Его здесь - http://www.codeproject.com/KB/aspnet/ASPNETService.aspx
Среда размещения ASP.NET очень опасна для любых длительных процессов, потребляющих ресурсы ЦП или операций ввода-вывода, поскольку может произойти внезапная выгрузка домена приложения.
Если вы хотите выполнять фоновые задачи вне конвейера обработки запросов, рассмотрите возможность использования http://hangfire.io, он справляется со всеми трудностями и рисками фоновой обработки за вас, без необходимости установки дополнительных служб Windows (но их можно использовать, когда придет время ). Есть и руководство по отправке почты.
Если вы можете жить в пределах 90-секундного ограничения по времени, вы можете использовать QueueBackgroundWorkItem. Другие варианты включают HangFire, Web Jobs и облачные сервисы Azure. См. Мой ответ ниже для более подробной информации.