Я знаю, что это старый вопрос, но вот мое мнение о таких вещах, для чего оно стоит, так как я не согласен с принятым ответом.
Вам не нужно AsyncController
, потому что вы не заинтересованы в ожидании завершения асинхронных операций. Таким образом, ответ на ваш вопрос в отношении MVC таков: это не имеет значения. Вы можете выполнять свою работу любым способом и выполнять обычное старое действие, которое запускает процесс и возвращает любой желаемый результат.
Вторая часть вашего вопроса действительно более актуальна. Вы хотите убедиться, что с асинхронными задачами ничего не произойдет, если вы запустили их из своего веб-процесса, предполагая, что сама задача не вызывает исключения. Ответ на этот вопрос зависит от ваших требований к надежности.
Вы упомянули, что вам не нужен отдельный процесс, и это ограничивает ваши возможности. Ваши задачи будут выполняться в одном домене приложения с вашим веб-приложением. Если что-то разрушит домен приложения или процесс, ваши задачи умрут, возможно, в странном состоянии. Это не обязательно даже из необработанных исключений. IIS может быть настроен на автоматическую перезапуск приложения время от времени или в определенных условиях. Или, если вы выпустите новый код или коснитесь чего-либо в каталоге bin, ваш домен приложения будет разрушен после завершения всех запросов и запуска нового. Если эти дела являются для вас препятствием, то у вас нет другого выбора, кроме как вывести свои задачи из процесса и обмениваться сообщениями с помощью какого-либо сообщения.
Если вы не беспокоитесь о том, что IIS убьет вас, вам все равно придется беспокоиться о себе. Необработанные исключения из других фоновых задач приведут к остановке процесса, если вы не воспользуетесь последним шансом с помощью события AppDomain.UnhandledException
. В случае использования библиотеки параллельных задач, задачи с исключениями, которые вы не наблюдаете, Wait
или их просмотр или просмотр свойств Result
или Exception
, приведут к остановке процесса, если у вас не будет последнего шанса. наблюдать их в событии TaskScheduler.UnobservedTaskException
.
Еще одно замечание: все потоки ThreadPool, используемые для фоновых операций, не смогут обслуживать запросы для вашего веб-приложения в течение этого времени. Вы можете управлять максимальным количеством потоков в пуле или вместо этого создать новый поток. Или, если вы используете TPL с планировщиком по умолчанию, запланируйте задачу с подсказкой LongRunning
, чтобы эффективно получить новый поток.