2010-11-04 188 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