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

Jas*_*ier 5 c# async-await

好像我过去曾经遇到过这个问题的答案,但现在我无法找到它.

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

await Method1();
await Method2();
Run Code Online (Sandbox Code Playgroud)

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

Das*_*ter 12

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

msdn的重要引用:

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

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

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

await Task.WhenAll(t1, t2, t3);
Run Code Online (Sandbox Code Playgroud)


小智 6

我知道这个线程有点旧,但我想添加一个我在使用异步方法时遇到的问题。

这纯粹是为了洞察力,我通过反复试验发现了一些东西。

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

await Task.Run(() => Method());
Run Code Online (Sandbox Code Playgroud)

...使用方法声明:

void Method() {...}
Run Code Online (Sandbox Code Playgroud)

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

例如,如果您有:

void Method1() {...}
void Method2() {...}
void Method3() {...}
Run Code Online (Sandbox Code Playgroud)

你这样称呼他们:

await Task.Run(() => Method1());
await Task.Run(() => Method2());
await Task.Run(() => Method3());
Run Code Online (Sandbox Code Playgroud)

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

为了克服这个问题,创建这样的函数:

async Task Method1() {...}
async Task Method2() {...}
async Task Method3() {...}
Run Code Online (Sandbox Code Playgroud)

并像这样称呼它们:

await Method1();
await Method2();
await Method3();
Run Code Online (Sandbox Code Playgroud)

  • TL;DR 避免 void async /sf/ask/3181356881/ (2认同)