Согласно документации этот метод пытается отложить завершение работы приложения до завершения фоновой работы.
Отличается от обычного рабочего элемента ThreadPool тем, что ASP.NET может отслеживать, сколько рабочих элементов, зарегистрированных через этот API, в данный момент выполняется, и среда выполнения ASP.NET будет пытаться отложить завершение работы AppDomain до тех пор, пока эти рабочие элементы не завершат выполнение .
Кроме того, он не передает определенные контексты, которые связаны с текущим запросом и не подходят для фоновой работы, не зависящей от запроса:
Этот перегруженный метод не передает ExecutionContext или SecurityContext от вызывающего к вызываемому. Поэтому члены этих объектов, такие как свойство CurrentPrincipal, не будут передаваться от вызывающего к вызываемому.
В ASP.NET нет способа убедиться, что фоновая работа когда-либо завершается. У машины может появиться синий экран, может быть ошибка, завершающая рабочий процесс, может быть время ожидания принудительного завершения и многое другое.
Или ваш код может содержать ошибку и сбой. Это также приводит к потере работы в очереди.
Если вам нужно, чтобы что-то выполнялось надежно, выполняйте его синхронно перед подтверждением завершения или ставьте в очередь где-нибудь (очередь сообщений, база данных, ...).
Это означает, что если запрос поступает (создается новый поток / выбирается), и он вызываетTask.Run, и ответ завершен (но Задача не выполнена), тогда Задача будет прервана.
Нет, Task.Run
работает независимо от HTTP-запросов. Фактически, нет способа отменить Task
, кроме случаев, когда код задачи отменяет сам себя.