Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我立即从MVC控制器操作返回,BeginInvoke会继续执行吗?_C#_.net_Asp.net Mvc_Multithreading - Fatal编程技术网

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,因为它更干净。再次感谢你的帮助。