- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读过 this documentation其中表示使用 HostingEnvironment.QueueBackgroundWorkItem
运行操作:
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 API cannot be called outside of an ASP.NET-managed AppDomain. The provided CancellationToken will be signaled when the application is shutting down.
所以我写了这个示例代码:
private void Check() {
HostingEnvironment.QueueBackgroundWorkItem(ct => CheckRecyclingBehaviour(ct));}
}
private async void CheckRecyclingBehaviour(CancellationToken ct) {
while (true) {
await Task.Delay(1000);
if (ct.IsCancellationRequested) {
AppendToFile("Recycling soon...");
await Task.Delay(1000);
AppendToFile("But we still have time to finish...");
break;
}
}
}
我运行了 check()
(在 IIS 7 上),过了一会儿我通过 IIS 管理器强制回收。
最后,我检查了 debug.txt 文件,其中包含一行:“即将回收...”。
所以我猜 CancellationToken 已发出信号,但 AppDomain 关闭并没有真正延迟(因为第二次打印从未发生)。
这看起来很奇怪,尤其是考虑到我读过的几篇文章都说 recycling will be delayed by 30 seconds .
我错过了什么吗?
最佳答案
你正在使用 async void
,这就是你的问题。正如我在 my MSDN article on async best practices, you should avoid async void 中描述的那样.
将 async void
更改为正确的 async Task
,您可能会看到它正常工作。
更多信息:检测 async void
方法的完成并非易事,因此您发布到 QueueBackgroundWorkItem
的代码实际上几乎立即完成(在第一个 等待
)。当 ASP.NET 关闭时,它设置取消标记(将第一行同步写入文件),然后等待任何排队的工作。由于工作已经完成,它会立即拆除应用程序域,放弃该方法的其余部分。
如果您使用 async Task
方法,则 QueueBackgroundWorkItem
将理解在任务完成之前代码未完成。
关于c# - HostingEnvironment.QueueBackgroundWorkItem 真的会延迟回收吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845906/
我们正在运行 ASP.NET WebAPI 2 服务,我们希望使用我们的记录器将一些请求记录到电子邮件/数据库中。 因为它是后台工作,而且因为在 asp.net 中,我认为我们应该使用 Hosting
我读过 Stephen's article关于 Asp.net 中的 fire and forget 后台操作。 不建议使用 Task.Run 进行即发即弃,因为 Asp.net 不知道您已将任务排队
我有一个 wep api,每秒收到超过 100 个请求,并且需要快速回复。 每个请求中有两个主要工作: 从缓存中获取答案并将其返回给用户 将结果发送到事件中心(进行一些每小时计算) API 调用者对第
我们正在使用 HostingEnvironment.QueueBackgroundWorkItem 对长时间运行的后台任务进行排队。这很好用,但是,当事务超时时,我们没有得到任何异常并且线程似乎被杀死
我读过 this documentation其中表示使用 HostingEnvironment.QueueBackgroundWorkItem 运行操作: Differs from a normal
在 ASP.NET QueueBackgroundWorkItem 方法中使用 async 有什么好处? HostingEnvironment.QueueBackgroundWorkItem(asyn
我正在使用 HostingEnvironment.QueueBackgroundWorkItem 在 ASP.Net 应用程序的后台运行工作,基于 Scott Hanselman 的博客文章 How
我有一个方法使用HostingEnvironment.QueueBackgroundWorkItem 我希望在此调用之前对某些行为进行单元测试,但是,测试因 System.InvalidOperati
有没有办法取消使用 HostingEnvironment.QueueBackgroundWorkItem 制作的后台任务? ? 有CancellationToken它会通知任务是否被取消,但我该怎么做
我需要在 ASP.NET WebAPI 中生成一些长时间运行的任务,我选择使用 QueueBackgroundWorkItem 来实现。 我的问题是 - 我需要为这些任务实现一个 WhenAll 机制
我尝试在 azure 辅助角色上使用 HostingEnviornment.QueueBackgroundWorkItem 在后台执行某些任务,但我在代码中遇到异常“由于当前状态,操作无效对象。”.
我们正在使用 .NET Core Web Api,并寻找一种轻量级解决方案来将具有可变强度的请求记录到数据库中,但不希望客户端等待保存过程。 不幸的是,dnx 中没有实现 HostingEnviron
我的理解是引入了 HostingEnvironment.QueueBackgroundWorkItem API,因此可以在 Asp.net 应用程序中生成一个新线程,并且当 AppDomain 发出关
我发现了一个不错的小工具,它已添加到 v4.5.2 中的 ASP.NET 我想知道它有多安全,以及如何在 ASP.NET MVC 或 Web API 场景中有效地利用它。 我知道我一直想在我的 Web
我正在编写一个自定义记录器,用于通过网络将日志从 Azure Functions 写入到目标。该记录器需要是“即发即忘”异步的——等待每个日志写入会太慢。但是,我不希望每次主机关闭时最后几个日志条目都
目前我正在使用 HostingEnvironment.RegisterObject 在我的 MVC 5 应用程序中运行我的后台工作。具体来说,我有, public class BackgroundWo
我有一个 ASP.Net 应用程序,其中使用 HostingEnvironment.QueueBackgroundWorkItem 运行后台任务,如下面的代码所示。 问题:下面代码中安排的后台任务是使
我有一个 Web 应用程序,它通过 QueueBackgroundWorkItem 在后台执行一些处理。 我正在为应用程序中的功能连接单元测试,当它尝试调用它时,我收到以下错误: System.Inv
使用到底有什么区别 Task.Run(() => { LongRunningMethod(); }); 或 HostingEnvironment.QueueBackgroundWorkIte
在“System.Web”ASP.NET中,后台工作可以通过RegisterObject注册/QueueBackgroundWorkItem为了参与 IIS 的关闭序列(完整的 90 秒宽限期),但我
我是一名优秀的程序员,十分优秀!