WCF服务调用异步其他WCF服务

时间:2010-11-04 07:38:54

标签: c# asynchronous async-await

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

3 个答案:

答案 0 :(得分:3)

编辑:如果您刚刚获得了BeginXXX和EndXXX方法,请参阅this question了解如何将这些方法转换为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

我发表了关于此的博文,首先是关于waiting for multiple tasks in general,然后关于exceptions when waiting for multiple tasks

答案 1 :(得分:1)

如果您想了解WCF团队支持async / await模型的计划,请查看以下博文:

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

阿马德奥

答案 2 :(得分:0)

Async CTP - How can I use async/await to call a wcf service?
有关异步客户端和服务的示例。 或者使用AsyncWcfLib,它支持Actor based programming model,并提供在应用程序内或通过网络调用其他服务的服务示例。