C# HostingEnvironment.QueueBackgroundWorkItem-澄清?
我已经阅读了Asp.net中的fire and forget后台操作 不建议使用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,并且响应已完成(
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。对吗?是的___________