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

    await someCall();
    await anotherCall();

我想知道是否有可能使运行时像这样执行:打电话 someCall() 以异步方式立即返回到调用线程,然后调用 anotherCall() 同样(无需等待 someCall 来完成)。因为我需要这两个方法异步运行,并假设这些调用只是fire和forget调用。

是否有可能使用just实现此场景 asyncawait (不使用旧 begin/end 机制)?

有帮助吗?

解决方案

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;

其他提示

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

var taskA = someCall();
var taskB = someOtherCall();
await taskA;
await taskB;

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

var result = await taskA + await taskB;

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

TaskEx.WhenAll 可能比两个等待更快。不知道,因为我还没有做过性能调查,但除非你看到一个问题,我认为两个连续的等待读得更好,特别是如果你ewant结果值。

如果您使用的是.NET4.5,则不再需要异步CTP。请注意,异步功能是由编译器实现的,因此.NET4应用程序可以使用它,但编译它需要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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top