Asynchronous 具有wait的多个并行异步调用

Asynchronous 具有wait的多个并行异步调用,asynchronous,multitasking,async-await,c#-5.0,Asynchronous,Multitasking,Async Await,C# 5.0,据我所知,当运行时遇到下面的语句时,它将函数的其余部分包装为对异步调用的方法的回调(someCall())。在这种情况下,anotherCall()将作为对someCall()的回调执行: 我想知道是否有可能让运行时执行如下操作:以异步方式调用someCall(),并立即返回到调用线程,然后以类似方式调用另一个调用()(无需等待someCall完成)。因为我需要这两个方法异步运行,并假设这些调用只是fire和forget调用 是否可以使用async和await(不使用旧的begin/end机制)

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

我想知道是否有可能让运行时执行如下操作:以异步方式调用
someCall()
,并立即返回到调用线程,然后以类似方式调用另一个调用()(无需等待
someCall
完成)。因为我需要这两个方法异步运行,并假设这些调用只是fire和forget调用


是否可以使用
async
await
(不使用旧的
begin
/
end
机制)来实现此场景?

async/await包含一些帮助并行组合的操作符,例如
WhenAll
whenay

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.whalll
可能比两次等待要快。我不知道,因为我还没有对此进行性能调查,但除非您发现问题,否则我认为连续两次等待会更好,特别是如果您等待结果值。

如果您使用.NET 4.5,则不再需要异步CTP。请注意,异步功能是由编译器实现的,因此.NET 4应用程序可以使用它,但编译它需要VS2012

不再需要TaskEx了。CTP无法修改现有框架,因此它使用扩展来完成语言在5.0中可以处理的事情。直接使用任务

因此,我用Task替换TaskEx,重新编写了代码(由斯蒂芬·克利里回答)

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;

引用“C#5.0中的异步”:“这是一种等待多个任务的危险方式,如果它们可能抛出异常。如果两个操作都抛出异常,则第一个
await
将传播其异常,这意味着
taskB
永远不会被等待。它的异常将不会被观察到,并且根据.NET版本和设置,可能会丢失甚至在意外线程上重新启动,从而终止进程。“因此,您最好坚持使用
wait Task.whalll(taskA,taskB)
EcmaScript/Javascript有这样的功能吗?@Azteca:当然,你可以用
承诺.all
代替
任务.WhenAll
,或
承诺.race
代替
任务.whenay
。例如,
等待承诺.all([promiseA,promiseB]);
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;