C# HostingEnvironment.QueueBackgroundWorkItem-澄清?

C# HostingEnvironment.QueueBackgroundWorkItem-澄清?,c#,asp.net,.net,multithreading,background-process,C#,Asp.net,.net,Multithreading,Background Process,我已经阅读了Asp.net中的fire and forget后台操作 不建议使用Task.Run进行fire and forget,因为Asp.net不知道您已将任务排入队列 因此,如果循环即将发生,任务无法知道它。 这就是HostingEnvironment.QueueBackgroundWorkItem进入的地方 它将知道循环即将发生,并将调用取消令牌 但是 FWIK-一旦主线程完成,后台任务将被“终止” 这意味着,如果请求进入(正在创建/获取新线程)并调用Task.Run,并且响应已完成(

我已经阅读了Asp.net中的fire and forget后台操作

不建议使用
Task.Run
进行fire and forget,因为Asp.net不知道您已将任务排入队列

因此,如果循环即将发生,任务无法知道它。
这就是
HostingEnvironment.QueueBackgroundWorkItem
进入的地方

它将知道循环即将发生,并将调用取消令牌

但是

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

这意味着,如果请求进入(正在创建/获取新线程)并调用
Task.Run
,并且响应已完成(但任务尚未完成),则任务将终止

问题:

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

文档上说:“独立于任何请求”,但我不确定它是否回答了我的问题,尽管根据,这种方法试图延迟应用程序关闭,直到后台工作完成

与普通线程池工作项的不同之处在于,ASP.NET可以跟踪通过此API注册的工作项当前正在运行的数量,并且ASP.NET运行时将尝试延迟AppDomain关闭,直到这些工作项完成执行

此外,它不会流动与当前请求相关的特定上下文,并且不适合独立于请求的背景工作:

此重载方法不会将ExecutionContext或SecurityContext从调用方流向被调用方。因此,这些对象的成员(如CurrentPrincipal属性)不会从调用者流向被调用者

在ASP.NET中,无法确保后台工作完成。机器可能会出现蓝屏,可能会有终止工作进程的错误,可能会有超时强制终止以及其他许多事情

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

如果您需要可靠地执行某些内容,请在确认完成之前同步执行它,或者将其排入某个位置(消息队列、数据库等)

这意味着,如果一个请求进入(正在创建/获取一个新线程)并调用estask.Run,并且响应已经完成(但任务尚未完成),那么任务将被终止


否,
Task.Run
独立于HTTP请求工作。事实上,除了任务的代码自动取消之外,没有办法取消任务。

抛开asp.net,如果我们有一个主线程和一个后台线程,并且主线程已经完成hd,这将导致后台线程也被终止。这是IsBackGround定义。现在…任务是后台线程。所以我再次问,如果一个请求线程已经完成了它的响应,那么来自该请求的inoked任务是否会继续(即使它是一个后台线程)?QueueBackgroundWorkItem会影响行为吗?
IsBackground
控制所有非后台线程退出时发生的情况。只要工作进程不想退出,所有后台线程都会继续运行
IsBackground
仅在ASP.NET要退出时才起作用。然后,运行时可以终止后台线程。线程没有以任何方式连接。运行时不理解“请求线程”的概念。此外,工作进程中有许多请求同时运行。尝试回收时,任务。运行将不会完成,但QueueBackgroundWorkItem将完成。至少它会尝试。ASP.NET无法等待任务。运行是因为它不知道该任务是否存在。因此无论请求线程是什么,
Task.Run
都是可靠的(假设在不久的将来没有回收),并且不会被gc’ed。对吗?是的___________