Quando si richiama un servizio WCF in modo asincrono, sembra che ci siano due modi per farlo.Quale modo si preferisce quando si eseguono chiamate WCF asincrone?
1.
WcfClient _client = new WcfClient();
public void One()
{
_client.BegindoSearch("input", ResultOne, null);
}
private void ResultOne(IAsyncResult ar)
{
string data = _client.EnddoSearch(ar);
}
2.
public void Two()
{
WcfClient client = new WcfClient();
client.doSearchCompleted += TwoCompleted;
client.doSearchAsync("input");
}
void TwoCompleted(object sender, doSearchCompletedEventArgs e)
{
string data = e.Result;
}
E con la nuova classe Task<T>
abbiamo un terzo modo semplice avvolgendo il sincronismo in un compito.
3.
public void Three()
{
WcfClient client = new WcfClient();
var task = Task<string>.Factory.StartNew(() => client.doSearch("input"));
string data = task.Result;
}
Tutti gli danno la possibilità di eseguire altro codice, mentre si attende per il risultato, ma penso che Task<T>
dà maggiore controllo su ciò che si esegue prima o dopo il risultato viene recuperato .
Ci sono vantaggi o svantaggi nell'usare l'uno sull'altro? O scenari in cui un modo per farlo è più preferibile?
L'aspetto del filo Worker vs IO è interessante. So che il pool di thread ha una quantità fissa di ciascuno e che è possibile cambiarli. Ma qual è la differenza tra un thread di lavoro e un thread di I/O nel framework. Presumo che sia più che una semantica. –
@ Mikael: I thread I/O sono progettati per lunghi periodi di attesa; in pratica vanno a dormire e aspettano che il sistema I/O li riattivi con un'interruzione. I thread di lavoro sono pensati per il lavoro pesante della CPU e non si vuole sprecarli per bloccare le chiamate I/O sincrone. – Aaronaught
ci sono ulteriori informazioni in questo articolo di MSDN sulle attività relative ai thread di lavoro - http://msdn.microsoft.com/en-us/magazine/ff959203.aspx - anche un buon background (una sorta di lezione di storia) sul diversi metodi asincroni disponibili in.NET –