Как я могу заставить метод работать в фоновом режиме ASP MVC - PullRequest
1 голос
/ 01 мая 2011

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

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

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

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

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

Chase Q, Aucoin

Ответы [ 3 ]

0 голосов
/ 01 мая 2011

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

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

0 голосов
/ 01 мая 2011

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

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

0 голосов
/ 01 мая 2011

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

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

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

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

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

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

...