我已经阅读了基于任务的异步模式,听起来很棒。现在,我有一个WCF服务,需要调用其他WCF服务。这些服务返回不同的结果。 Async如何使用新模式来调用这些服务并等待全部完成?

有帮助吗?

解决方案

编辑:如果您刚刚有beginxxx和endxxx方法,请参见 这个问题 如何将它们变成 Task<T> 任务 - 和 然后 我的其余答案将适用。

基本上,您需要 TaskFactory<T>.FromAsync(...).


您可以使用 TaskEx.WhenAll, ,最终将是 Task.WhenAll.

请注意,这将等待 全部 即使有较早的错误,要完成的任务也是如此。

由于任务具有不同的结果类型,您需要将它们设置为开始,等待它们全部完成,然后获取结果:

var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();

await TaskEx.WhenAll(t1, t2, t3);

var result1 = t1.Result;
var result2 = t2.Result;
var result3 = t3.Result;

// Use the results

另外,只需开除从任务开始,然后分别等待每个任务。请注意,TAP中的任务是“热” - 它们一旦创建它们就开始,而不是等待它们。所以这也可以工作 - 但是这一次 t1 引发例外,它 惯于 等待 t2t3 去完成:

var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();

var result1 = await t1;
var result2 = await t2;
var result3 = await t3;

// Use the results

我已经写了这一点,首先 一般等待多个任务 然后大约 等待多个任务时的例外.

其他提示

如果您想了解WCF团队支持异步/等待模型的计划,请查看以下博客文章:

http://blogs.msdn.com/b/endpoint/archive/2010/11/13/simplified-asynchronous-programming-model-in-wcf-wcf-with-with-async-await.aspx

amadeo

异步CTP-如何使用异步/等待WCF服务?
有关异步客户和服务的示例。或使用 异步, ,它支持 基于演员的编程模型 并提供了呼叫应用程序或网络上其他服务的服务的示例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top