Как я могу запустить метод в фоновом режиме ASP MVC

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

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

так как я могу заставить метод выполняться как рабочий и освободить контроллер?

Любая помощь будет принята с благодарностью.

всего наилучшего,

Чейз Кью, Aucoin


person ChaseAucoin    schedule 01.05.2011    source источник


Ответы (3)


Используйте ThreadPool.QueueUserWorkItem() в качестве забудьте о подходе на странице ASPX.

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

Вам нужно позаботиться о том, чтобы обработать случай, когда w3wp.exe останавливается во время 15-минутного запуска. Что вы будете делать, если работа выполнена на 2/3? Некоторые варианты: сделать работу перезапускаемой или просто позволить забыть о прерванной работе.

Если сделать его перезапускаемым, это может означать, что при перезапуске w3wp.exe ваша логика ASP.NET обязательно возобновит любую работу, которая была прервана. Это может означать, что ваша логика ASP.NET устанавливает «точки синхронизации», чтобы она знала, где перезапускаться.

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

см. также:
Перемещение процесса, отнимающего время, из моего приложения asp.net
тег Workflow Foundation

person Cheeso    schedule 01.05.2011
comment
Большое спасибо за отзыв, я прочитаю предоставленную вами информацию, но на первый взгляд похоже, что это должно помочь. - person ChaseAucoin; 01.05.2011

Это поможет > http://msdn.microsoft.com/en-us/library/ms227433.aspx

Это стандартный способ запуска фонового процесса на сервере в стеке .NET.

person neebz    schedule 01.05.2011

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

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

person Ladislav Mrnka    schedule 01.05.2011