- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 Controller 完成他的工作后完成一些轻量级任务,我使用HostingEnvironment.QueueBackgroundWorkItem()
为此。
我看到了一个奇怪的行为,所以我为此制作了一个人工概念验证应用。
在我的 global.asax.cs
我有这个不错的功能:
public class MvcApplication : HttpApplication
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public static void ContinueWorkOnBackground(Task workItem)
{
workItem.ContinueWith(t =>
{
if (t.IsFaulted)
{
var ex = t.Exception;
logger.Error(ex);
}
});
HostingEnvironment.QueueBackgroundWorkItem(_ => workItem);
}
然后在我的 Controller 中我创建了一个工作项并将其扔到那里:
public ActionResult About()
{
logger.Info("About");
ViewBag.Message = "Your application description page.";
MvcApplication.ContinueWorkOnBackground(TestWorkItem());
return View();
}
private async Task TestWorkItem()
{
logger.Trace("TestWorkItem");
await Task.Delay(500);
logger.Trace("let's fail");
throw new NotImplementedException();
}
我在日志中看到消息“TestWorkItem”,但从来没有“让我们失败”,也没有关于错误的消息。
我也做了HostingEnvironment.QueueBackgroundWorkItem((Func<CancellationToken,Task>)(_ => workItem));
以确保调用没有歧义。
我该如何解决这个问题?
最佳答案
你的问题是TestWorkItem
正在捕获当前请求上下文,并在其 await
之后尝试在该请求上下文上恢复. (我在我的博客上解释了 how this capture/resume works)。由于请求已完成,请求上下文在它尝试恢复时已不存在。
最好的解决方法是允许 QueueBackgroundWorkItem
在请求上下文之外执行代码。因此,首先更改您的辅助方法以获取 Func<Task>
而不是 Task
:
public static void ContinueWorkOnBackground(Func<Task> workItem)
{
HostingEnvironment.QueueBackgroundWorkItem(async _ =>
{
try
{
await workItem();
}
catch (Exception ex)
{
logger.Error(ex);
}
});
}
然后你可以这样调用它:
public ActionResult About()
{
logger.Info("About");
ViewBag.Message = "Your application description page.";
MvcApplication.ContinueWorkOnBackground(() => TestWorkItem());
return View();
}
关于asp.net-mvc - asp.net mvc 4.5 : getting HostingEnvironment. QueueBackgroundWorkItem 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34418170/
我们正在运行 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 秒宽限期),但我
我是一名优秀的程序员,十分优秀!