繁体   English   中英

如果我立即从MVC控制器操作返回,BeginInvoke是否将继续执行?

[英]Will BeginInvoke continue to execute if I return immediately from an MVC controller action?

我正在尝试解决一个问题,我们认为在某些情况下可能不会执行异步调用。

  • 即使在控制器返回并且没有调用EndInoke()之后, doWork()也会完成执行吗?
  • 是否还有另一种情况无法执行,例如doWork()中抛出异常?
delegate void TestDelegate();
void doWork()
{
    Thread.Sleep(5000);
}
public ActionResult Test()
{
    var myAsyncCall = new TestDelegate(doWork);
    myAsyncCall.BeginInvoke();
    return View();
}

通常,您需要在委托上调用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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM