HostingEnvironment.QueueBackgroundWorkItem - Уточнение? - PullRequest
1 голос
/ 05 июля 2019

Я прочитал Статья Стивена о пожаре и забудьте о фоновых действиях в Asp.net.

Не рекомендуется использовать Task.Run для запуска и забывания, потому что Asp.net не знает, что вы поставили задачу в очередь.

Так что, если рециркуляция вот-вот произойдет, задача не сможет ее узнать.
Вот где HostingEnvironment.QueueBackgroundWorkItem входит.

Он будет знать, что должна произойти переработка, и вызовет токен отмены.

Но!

FWIK - Фоновые задачи «завершаются» после завершения основного потока.

Это означает, что если запрос поступает (создается новый поток / выбирается), и он вызывает Task.Run, и ответ завершен (но Задача не выполнена), тогда Задача будет прервана.

Вопрос:

Решает ли QueueBackgroundWorkItem эту проблему? или он существует только для предупреждения о переработке? Другими словами, если есть запрос, который запускает QueueBackgroundWorkItem и ответ завершен, QueueBackgroundWorkItem продолжит выполнять свой код?

В документах сказано: "независимо от запроса", но я не уверен, что он отвечает на мой вопрос, хотя

1 Ответ

1 голос
/ 06 июля 2019

Согласно документации этот метод пытается отложить завершение работы приложения до завершения фоновой работы.

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

Кроме того, он не передает определенные контексты, которые связаны с текущим запросом и не подходят для фоновой работы, не зависящей от запроса:

Этот перегруженный метод не передает ExecutionContext или SecurityContext от вызывающего к вызываемому. Поэтому члены этих объектов, такие как свойство CurrentPrincipal, не будут передаваться от вызывающего к вызываемому.

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

Или ваш код может содержать ошибку и сбой. Это также приводит к потере работы в очереди.

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

Это означает, что если запрос поступает (создается новый поток / выбирается), и он вызываетTask.Run, и ответ завершен (но Задача не выполнена), тогда Задача будет прервана.

Нет, Task.Run работает независимо от HTTP-запросов. Фактически, нет способа отменить Task, кроме случаев, когда код задачи отменяет сам себя.

...