2010-11-04 6 views
2

Я читал об асинхронном шаблоне, основанном на задачах, и это звучит здорово. Теперь у меня есть служба WCF, которая должна вызывать другие службы WCF. Эти службы возвращают результат differnet. Как можно переадресовать эти службы с помощью нового шаблона и ждать завершения?WCF вызов службы async другие услуги WCF

ответ

3

EDIT: Если вы только что получили 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 бросает исключение, он не ждать t2 и t3 для завершения:

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

Спасибо за ваш ответ , но я не все понял. Я думаю, сервис1, service2 и service3 являются прокси-клиентами для этих услуг. DoFirstTaskAsync, DoSecondTaskAsync и DoThirdTaskAsync - это методы этих служб. Но методы не возвращают Task или Task , они возвращаются IList , а также подписи для методов IAsyncResult BeginSomthing и IList EndSomthing (для реализации асинхронного шаблона) Где я неправ? – Mirko

+0

@Mirko: Будет редактировать. –

Смежные вопросы