使用await进行多个并行异步调用

rov*_*sen 37 asynchronous multitasking async-await c#-5.0

据我所知,当运行时遇到下面的语句时,它将函数的其余部分包装为异步调用的方法的回调(在本例中为someCall()).在这种情况下,anotherCall()将作为someCall()的回调执行:

    await someCall();
    await anotherCall();
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能使运行时执行如下:以异步方式调用someCall()并将immidatelly返回到调用线程,然后类似地调用anotherCall()(无需等待someCall完成).因为我需要这两个方法异步运行,并假设这些调用只是激活而忘记调用.

那么是否可以使用async和await(不使用旧的开始/结束机制)来实现这种情况?

Ste*_*ary 51

async/await包含一些帮助并行组合的运算符,例如WhenAllWhenAny.

var taskA = someCall(); // Note: no await
var taskB = anotherCall(); // Note: no await

// Wait for both tasks to complete.
await Task.WhenAll(taskA, taskB);

// Retrieve the results.
var resultA = taskA.Result;
var resultB = taskB.Result;
Run Code Online (Sandbox Code Playgroud)

  • 有 EcmaScript / Javascript 的这些吗? (2认同)
  • @Azteca:当然,您可以使用`Promise.all`代替`Task.WhenAll`,或者使用`Promise.race`代替`Task.WhenAny`.例如,`await Promise.all([promiseA,promiseB]);` (2认同)

Cel*_*ish 6

最简单的方法可能是这样做:

var taskA = someCall();
var taskB = someOtherCall();
await taskA;
await taskB;
Run Code Online (Sandbox Code Playgroud)

如果你想要结果值,这个特别好:

var result = await taskA + await taskB;
Run Code Online (Sandbox Code Playgroud)

所以你不需要这样做 taskA.Result.

TaskEx.WhenAll彼此之后可能会比两个等待更快.我不知道,因为我没有对此进行过性能调查,但除非你看到问题,否则我认为连续两次等待读数更好,特别是如果你想要结果值.

  • 所以你最好坚持`await Task.WhenAll(taskA,taskB);` (2认同)