Подтвердить что ты не робот

Разница между Task.Run и QueueBackgroundWorkItem в Asp.Net

В чем именно разница, используя

Task.Run(() => { 
     LongRunningMethod();
});

или

HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());

Я тестировал приложение Asp.Net MVC, в котором я продолжал писать строку в текстовый файл около 10 минут внутри асинхронной задачи, которая вызывается с помощью Task.Run или QBWI.

Это прекрасно работает как с помощью Task, так и с QBWI. Мой асинхронный метод продолжает писать в этот файл без каких-либо проблем до 10 минут. Никакое нарушение IIS я не наблюдалось в отношении его рециркуляции.

Итак, что же особенного в QueueBackgroundWorkItem?

4b9b3361

Ответ 1

документация имеет отличное объяснение:

Отличается от обычного рабочего элемента ThreadPool тем, что ASP.NET может поддерживать отслеживать, сколько рабочих элементов, зарегистрированных через этот API, в настоящее время и среда выполнения ASP.NET попытается отложить закрытие AppDomain пока эти рабочие элементы не закончили выполнение. Этот API не может быть вызывается вне AppDomain под управлением ASP.NET. Предоставленный CancellationToken будет сигнализироваться, когда приложение закрывается вниз.

Task.Factory.StartNew не регистрирует работу во время выполнения ASP.NET. Вы используете свой код в течение 10 минут, это не имеет значения. Переработка IIS происходит в определенное время, которое установлено в IIS. Если вы действительно хотите проверить, что происходит, вы можете попытаться принудительно переработать.

Ответ 2

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

http://codingcanvas.com/using-hostingenvironment-queuebackgroundworkitem-to-run-background-tasks-in-asp-net/

В основном это говорит о том, что использование задач queuebackgroundworkitem регистрируется в среде выполнения ASP.Net, и если процесс закрыт или сбой, среда выполнения ASP.NET по-прежнему дает некоторый льготный период для завершения процессов. Это также связано с отправкой уведомлений в процесс, может завершать и выполнять любые задачи финализации, тогда как все это невозможно, если вы используете Task.Run

Ответ 3

Отключение AppDomain может быть отложено только на 90 секунд (на самом деле это минимум HttpRuntimeSection.ShutdownTimeout и processModel shutdownTimeLimit). Если у вас столько позиций в очереди, что они не могут быть завершены за 90 секунд, среда выполнения ASP.NET выгрузит AppDomain, не дожидаясь завершения рабочих элементов.

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/