2010-11-04 132 views
2

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

回答

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

+0

感谢您的回答, 但我还没有理解一切。 我认为service1,service2和service3是服务的代理客户端。 DoFirstTaskAsync,DoSecondTaskAsync和DoThirdTaskAsync是这些服务上的方法。 但方法不返回任务或任务,他们返回的IList ,也为方法签名的IAsyncResult BeginSomthing和IList的 EndSomthing(实现异步模式) 我在哪里错了? – Mirko 2010-11-04 11:02:37

+0

@Mirko:将编辑。 – 2010-11-04 11:18:53