【发布时间】:2015-12-22 23:14:51
【问题描述】:
我正在尝试完成一些轻量级任务在控制器完成他的工作之后,我为此使用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);
}
在我的控制器中,我创建了一个工作项并将其扔到那里:
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)); 来确保通话没有歧义。
我该如何解决这个问题?
【问题讨论】:
-
NLog 生命周期是否以任何方式与请求相关联?附带说明,当
await可用时,最好不要使用ContinueWith。 -
NLog 在那里。我可以打开主页并看到它附加到日志中。
标签: asp.net-mvc asp.net-mvc-4 task-parallel-library