HostingEnvironment.QueueBackgroundWorkItem - 澄清?

HostingEnvironment.QueueBackgroundWorkItem - Clarification?

我在 Asp.net 中阅读了 Stephen's article 关于 fire and forget 后台操作的内容。

不建议使用 Task.Run 进行即发即弃,因为 Asp.net 不知道您已将任务排队。

所以如果回收即将发生,任务无法知道。
这就是 HostingEnvironment.QueueBackgroundWorkItem 的用武之地。

它将知道回收即将发生并将调用取消令牌。

但是!

FWIK - 一旦主线程完成,后台任务将被“终止”。

这意味着如果一个请求进入(一个新线程正在created/fetched)并且它调用Task.Run,并且响应已经完成(但任务还没有)那么任务将是已终止。

问题:

QueueBackgroundWorkItem能解决这个问题吗?或者它只是为了警告回收而存在? 换句话说,如果有一个请求运行 QueueBackgroundWorkItem 并且响应已经完成,QueueBackgroundWorkItem 会继续执行它的代码吗?

文档说:“独立于任何请求”,但我不确定它是否回答了我的问题

根据 documentation,此方法尝试延迟应用程序关闭,直到后台工作完成。

Differs from a normal ThreadPool work item in that ASP.NET can keep track of how many work items registered through this API are currently running, and the ASP.NET runtime will try to delay AppDomain shutdown until these work items have finished executing.

此外,它不会流动与当前请求关联且不适合 request-independent 后台工作的某些上下文:

This overloaded method doesn't flow the ExecutionContext or SecurityContext from the caller to the callee. Therefore, members of those objects, such as the CurrentPrincipal property, will not flow from the caller to the callee.

在 ASP.NET 中,无法确保后台工作完成。机器可能蓝屏,可能有错误终止工作进程,可能有超时强制终止等等。

或者,您的代码可能存在错误并崩溃。这也会导致排队的工作丢失。

如果你需要可靠地执行某些东西,在确认完成之前同步执行它,或者在某个地方排队(消息队列,数据库,...)。

That means that if a request gets in (a new thread is being created/fetched) and it invokesTask.Run, and the response has finished (but Task has not) then the Task will be terminated.

不,Task.Run 独立于 HTTP 请求工作。事实上,没有办法取消 Task 除非任务代码自行取消。