chiamata di servizio WCF asincrona altri servizi WCF
-
28-09-2019 - |
Domanda
Ho letto sul modello asincrono basato su attività e sembra grande. Ora, ho un servizio WCF che ha bisogno di chiamare altri servizi WCF. Tali servizi restituiscono differnet risultato. Come può asincrona chiamare tali servizi con il nuovo modello e aspettano tutti per completare?
Soluzione
EDIT: Se hai appena avuto metodi BeginXXX e EndXXX, vedi questa domanda per come trasformare quelli in attività Task<T>
-. e poi il resto della mia risposta sarà applicabile
In sostanza, è necessario TaskFactory<T>.FromAsync(...)
.
È possibile utilizzare TaskEx.WhenAll
, che alla fine sarà Task.WhenAll
.
Si noti che questo attenderà tutti i compiti alla fine, anche se c'è un errore iniziale.
Per quanto i compiti sono diversi tipi di risultato, è necessario configurarli per cominciare, attesa per tutti loro alla fine, poi prendete i risultati:
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
In alternativa, basta sparare i compiti per cominciare, e aspettano ciascuno separatamente. Si noti che le attività in TAP sono "caldo" - cominciano non appena li si crea, non quando li attendono. Quindi questo funzionerà anche - ma questa volta se t1
genera un'eccezione, è non attesa per t2
e t3
al completo:
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
Ho bloggato su questo, in primo luogo circa in attesa di più attività in generale e poi su eccezioni quando in attesa di più attività .
Altri suggerimenti
Se si desidera conoscere i piani della squadra WCF per sostenere il modello / await asincrona, date un'occhiata al seguente post del blog:
Amadeo
Async CTP - Come posso usare asincrona / await di chiamare un servizio WCF
?
per gli esempi sui client e servizi asincrone.
Oppure utilizzare AsyncWcfLib , supporta un Attore basato modello di programmazione e ha esempi di servizi di chiamata di altri servizi all'interno di un'applicazione o sulla rete.