gpt4 book ai didi

asp.net-mvc - asp.net mvc 4.5 : getting HostingEnvironment. QueueBackgroundWorkItem 工作

转载 作者:行者123 更新时间:2023-12-02 17:30:08 25 4
gpt4 key购买 nike

我试图在 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/

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