在控制器完成他的工作后,我试图完成一些轻量级任务,我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);
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我创建了一个工作项并将其扔到那里:
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();
}
Run Code Online (Sandbox Code Playgroud)
我在日志中看到消息“TestWorkItem”,但从来没有“让我们失败”,也没有关于错误的消息。
我还HostingEnvironment.QueueBackgroundWorkItem((Func<CancellationToken,Task>)(_ => workItem)); …