按顺序执行多个异步方法调用

时间:2014-11-18 14:53:55

标签: c# async-await

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

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

await Method1();
await Method2();

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

2 个答案:

答案 0 :(得分:12)

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

来自msdn的重要引言:

  

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

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

var t1 = DoTaskAsync(...);
var t2 = DoTaskAsync(...);
var t3 = DoTaskAsync(...);

await Task.WhenAll(t1, t2, t3);

答案 1 :(得分: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());

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

要解决此问题,请创建如下函数:

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

并像这样打电话给他们:

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