【问题标题】:Finally block to execute when all async calls completed当所有异步调用完成时,finally 块执行
【发布时间】:2016-12-14 23:59:50
【问题描述】:

我希望掌握这种情况,我有一个父方法 - EventMethod,它在内部调用另一个方法 - Handler1()。 Handler1() 内部调用异步方法,内部调用其他一些异步方法。链子还长了一点。

只有在所有异步调用都完成后,我才能执行我的 finally 语句? 在下面的代码中,一旦在调用 Handler1() 方法中触发了 await,就会立即调用 finally

void EventMethod()
{
try { 
 Helper.Handler1();
 } catch(Exception ex){}
finally{
  GlobalVariable.ExecutionCompleted = true;
}

【问题讨论】:

  • Handler1();这个方法的返回类型是什么

标签: c# asynchronous async-await task try-catch-finally


【解决方案1】:
async void EventMethod()
{
  try 
  { 
    await Helper.Handler1(); //Make sure this return Task
  }
  catch(Exception ex)
  {
  }
  finally
  {
    GlobalVariable.ExecutionCompleted = true;
  }
}

模拟你的助手

    private static Task Handler1()
    {
        var t1 = DoSomething2();
        var t2 = DoSomething3();
        return Task.WhenAll(t1, t2); //You could return the task or await here itself 
    }

    private static Task DoSomething2()
    {
        Console.WriteLine("DoSomethign 2");
        return Task.Delay(3000);
    }

    private static Task DoSomething3()
    {
        Console.WriteLine("DoSomethign 3");
        return Task.Delay(3000);
    }

您可以获得工作示例dotnetfiddle。我试图重现我对你的问题的理解。例如,您可以找到两个可以并行执行的任务

【讨论】:

    【解决方案2】:

    您的处理程序方法返回为Task。你可以打电话给Wait()。请参阅 MSDN 中的 Task

    【讨论】:

    • 如果你打电话给Wait(),那么它有点违背async的目的
    • 但它看起来不像普通的EventHandler(它缺少EventArgs),所以我怀疑它是一种回调。如果是普通的EventHandler,您可以按照 Eldho 的建议使用 async void。这是async void的唯一正常推荐用法。
    • 是的,这是真的。顺便说一句,我没有投反对票。 :)
    猜你喜欢
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2012-02-09
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多