C# 如果我立即从MVC控制器操作返回,BeginInvoke会继续执行吗?
我试图解决一个问题,我们认为异步调用在某些情况下可能无法执行C# 如果我立即从MVC控制器操作返回,BeginInvoke会继续执行吗?,c#,.net,asp.net-mvc,multithreading,C#,.net,Asp.net Mvc,Multithreading,我试图解决一个问题,我们认为异步调用在某些情况下可能无法执行 即使在控制器返回并且没有调用EndInoke()之后,doWork()是否会完成执行 是否还有另一种情况不会执行此操作,例如doWork()中的异常抛出 delegate void TestDelegate(); 无效销钉() { 睡眠(5000); } 公共行动结果测试() { var myAsyncCall=新的TestDelegate(doWork); myAsyncCall.BeginInvoke(); 返回视图(); }
- 即使在控制器返回并且没有调用EndInoke()之后,doWork()是否会完成执行李>
- 是否还有另一种情况不会执行此操作,例如doWork()中的异常抛出
delegate void TestDelegate();
无效销钉()
{
睡眠(5000);
}
公共行动结果测试()
{
var myAsyncCall=新的TestDelegate(doWork);
myAsyncCall.BeginInvoke();
返回视图();
}
通常,您需要在代理上调用EndInvoke
。这将允许您确定事情不起作用的原因(例如在doWork
中引发异常,这将解释所描述的问题)
有关详细信息,请参阅MSDN上的
也就是说,我建议对其进行修改,以使用TPL而不是delegate.BeginInvoke
,因为它使一些检查总体上更简单。您可以将上述内容写成:
public ActionResult Test()
{
// Start the async work, and attach a continuation which happens if exceptions occur
Task.Run(() => doWork())
.ContinueWith(t =>
{
var ex = t.Exception.InnerException;
LogException(ex);
}, TaskContinuationOptions.OnlyOnFaulted);
return View();
}
我使用了缩进,但它的格式不正确。您可以自己尝试,例如通过观察在
doWork
中创建的副作用,例如写入控制台、创建文件或引发异常,轻松找到这一点。您可能会发现:(1)是的,它会在控制器返回后继续执行,(2)抛出可能会使您的应用程序崩溃。@Alex我无法在本地复制这一点,但在我们的生产环境中已经见过几次了谢谢Reed。我将很快尝试并发布结果。我做了一系列测试,有调用EndInvoke和没有调用EndInvoke,无论我将线程设置为睡眠的长度如何,它似乎总是工作正常。仍然对内部工作方式感到困惑,但我最终添加了更多日志记录并使用TPL,因为它更干净。再次感谢你的帮助。