我已经读过Stephen's article关于火,而忘记了Asp.net中的后台操作。
不建议使用Task.Run
进行即发即弃,因为Asp.net不知道您已将任务排队。
因此,如果即将发生回收,则该任务将无法得知它。
这就是HostingEnvironment.QueueBackgroundWorkItem
进入的地方。
它将知道回收即将发生,并将调用取消令牌。
但是!
FWIK-主线程完成后,后台任务将“终止”。
这意味着,如果请求进入(正在创建/获取一个新线程)并调用Task.Run
,并且响应已完成(但Task尚未完成),则Task将终止。
问题:
QueueBackgroundWorkItem
是否可以解决此问题?还是只警告回收?
换句话说,如果有一个运行QueueBackgroundWorkItem
的请求并且响应已完成,QueueBackgroundWorkItem
会继续执行其代码吗?
文档说:“独立于任何请求”,但是我不确定它是否回答了我的问题
答案 0 :(得分:1)
根据documentation,此方法尝试将应用程序关闭延迟到后台工作完成为止。
与正常ThreadPool工作项的不同之处在于,ASP.NET可以跟踪当前正在运行通过此API注册的工作项的数量,并且ASP.NET运行时将尝试延迟AppDomain关闭,直到这些工作项执行完毕
此外,它不会流过与当前请求相关联且不适用于与请求无关的后台工作的某些上下文:
此重载方法不会将ExecutionContext或SecurityContext从调用方传递到被调用方。因此,这些对象的成员(例如CurrentPrincipal属性)将不会从调用者流向被调用者。
在ASP.NET中,无法确保后台工作能够完成。机器可能会蓝屏,可能存在终止工作进程的错误,可能是超时导致终止工作以及其他许多情况。
或者,您的代码可能存在错误并崩溃。这也会导致排队的工作也丢失。
如果您需要可靠地执行某些任务,请在确认完成之前将其同步执行,或者将其排队(在消息队列,数据库等)。
这意味着,如果一个请求进入(正在创建/获取一个新线程)并且调用了Task.Run,并且响应已完成(但Task尚未完成),则Task将终止。
否,Task.Run
的工作独立于HTTP请求。实际上,除非任务代码自行取消,否则无法取消Task
。