多个并行异步调用与await

| 据我所知,当运行时遇到下面的语句时,它会将函数的其余部分包装为异步调用的方法的回调(在此示例中为“ 0”)。在这种情况下,将执行be1ѭ作为对
someCall()
的回调:
    await someCall();
    await anotherCall();
我想知道是否有可能使运行时像这样执行:以异步方式调用
someCall()
并立即返回到调用线程,然后类似地调用
anotherCall()
(无需等待
someCall
完成)。因为我需要这两种方法来异步运行,并假设这些调用只是触发并忘记了调用。 是否可以仅使用
async
await
来实现此方案(不使用旧的implement9ѭ/
end
机制)?     
已邀请:
async / await包含一些运算符来帮助并行合成,例如
WhenAll
和to12ѭ。
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;
    
最简单的方法可能是这样做:
var taskA = someCall();
var taskB = someOtherCall();
await taskA;
await taskB;
如果您想要结果值,这尤其好:
var result = await taskA + await taskB;
所以您不需要做
taskA.Result
TaskEx.WhenAll
可能快于彼此等待两个。我不知道,因为我还没有对此进行性能调查,但是除非您遇到问题,否则我认为连续两个等待的读取效果更好,尤其是当您查询结果值时。     
如果您使用的是.NET 4.5,则不再需要异步CTP。请注意,异步功能由编译器实现,因此.NET 4应用程序可以使用它,但需要VS2012对其进行编译。 TaskEx不再需要。 CTP无法修改现有框架,因此它使用扩展来完成该语言将在5.0中处理的事情。只需直接使用Task。 因此,我将TaskEx替换为Task,从而重新编写了代码(由Stephen Cleary回答)。
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;
    

要回复问题请先登录注册