gpt4 book ai didi

c# - HostingEnvironment.QueueBackgroundWorkItem - 澄清?

转载 作者:行者123 更新时间:2023-12-03 12:58:55 36 4
gpt4 key购买 nike

我读过 Stephen's article关于 Asp.net 中的 fire and forget 后台操作。

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

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

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

但是!

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

这意味着如果请求进入(正在创建/获取新线程)并且它调用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.

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

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,除非任务的代码自行取消。

关于c# - HostingEnvironment.QueueBackgroundWorkItem - 澄清?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56901224/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com