【问题标题】:Perform Multiple Async Method Calls Sequentially按顺序执行多个异步方法调用
【发布时间】:2016-10-27 18:02:38
【问题描述】:

似乎我过去曾遇到过这个问题的答案,但现在我找不到它。

假设我有两个异步方法,Method1 和 Method2。如果我需要依次调用 Method1 再调用 Method2(读取,Method1 必须在 Method2 之前完成),下面的代码是否正确?

await Method1();
await Method2();

根据另一个 SO 问题 here 的已接受答案的信息和 MSDN 文章 here 中的信息,我相信这是正确的方法。此外,这段代码似乎可以工作,但我不想引入一个以后更难追踪的细微错误。

【问题讨论】:

    标签: c# async-await


    【解决方案1】:

    是的,这是正确的方法。它们将按顺序执行。

    msdn 的重要引述:

    await 运算符告诉编译器异步方法无法继续超过该点,直到等待的异步过程完成。

    如果你想并行执行它们,你必须使用这样的东西:

    var t1 = DoTaskAsync(...);
    var t2 = DoTaskAsync(...);
    var t3 = DoTaskAsync(...);
    
    await Task.WhenAll(t1, t2, t3);
    

    【讨论】:

      【解决方案2】:

      我知道这个线程有点老了,但我想补充一个我在使用异步方法时遇到的问题。

      这纯粹是为了洞察力,是我通过反复试验得出的结论。

      如果你创建了一个void()方法,你不能await它,除非你像这样调用方法:

      await Task.Run(() => Method());
      

      ...带有方法声明:

      void Method() {...}
      

      使用await Task.Run 调用函数会执行多个方法,而无需等待任何先前的函数执行。

      如果你有:

      void Method1() {...}
      void Method2() {...}
      void Method3() {...}
      

      你这样称呼他们:

      await Task.Run(() => Method1());
      await Task.Run(() => Method2());
      await Task.Run(() => Method3());
      

      在调用 Method2 等之前,await 操作不会等待 Method1 完成。

      要克服这个问题,请创建如下函数:

      async Task Method1() {...}
      async Task Method2() {...}
      async Task Method3() {...}
      

      然后这样称呼他们:

      await Method1();
      await Method2();
      await Method3();
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2019-02-24
      • 2021-09-15
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多