Potevi almeno confermare se stai compilando con .net 4.5
poi potevi dirmi se la sintassi che ti ho indicato funziona o meno, se ti ha indirizzato verso una soluzione o se ci sono altri problemi e nel caso quali.
La domanda che poni non puo trovare una risposta esauriente. Non è una classe nuova ma una sintassi nuova, alle spalle c'è tutto il vecchio modello di programmazione asincrona più tutto quello che ha introdotto la classe Task del .net 4.0. Troppe cose.
comunque ormai ci siamo, pur non sapendo se è il tuo caso, puo essere utile se non altro al forum:
Il webservice è un asmx hello world predefinito su cui ho aggiunto un attesa di 5 secondi.
Metodo sincrono
codice:
protected void Button1_Click(object sender, EventArgs e)
{
DateTime inizio = DateTime.Now;
ServiceReference1.WebService1SoapClient ws = new ServiceReference1.WebService1SoapClient();
var r = ws.HelloWorld();
PlaceHolder2.Controls.Add(
new Label { Text = " Risultato Sincrono: " + r + "
" });
PlaceHolder2.Controls.Add(
new Label { Text = "Tempo: " + (DateTime.Now - inizio).Seconds + "
" });
}
Nulla di nuovo. Chiami la funzione che ci mette 5 secondi prima di dare il risultato che stampi a video.
Metodo asincrono
codice:
protected async void Button2_Click(object sender, EventArgs e)
{
DateTime inizio = DateTime.Now;
ServiceReference1.WebService1SoapClient ws = new ServiceReference1.WebService1SoapClient();
var r = await ws.HelloWorldAsync();
PlaceHolder2.Controls.Add(
new Label { Text = "Risultato asincrono: " + r.Body.HelloWorldResult + "
" });
PlaceHolder2.Controls.Add(
new Label { Text = "Tempo: " + (DateTime.Now - inizio).Seconds + "
" });
}
Questa sintassi usa le nuove parole chiave async e await. Il metodo deve essere contrassegnato come async. Effettui la chiamata al servizio asincrono che normalmente ritornerebbe un oggetto di sincronizzazione, grazie ad await però effettuo il pooling aspettando il direttamente risultato sottoforma di oggetto HelloWorldResponse. La classe HelloWorldResponse viene creata da visualstudio quando importo il servizio.
Per poter usare questa sintassi è necessario che la pagina aspx contenga la direttiva Async="True".
Questo sistema non porta grossi benefici rispetto alla chiamata sincrona perché viene effettuato il pooling subito dopo la chiamata asincrona, lo si puo vedere dalla label che segna il tempo. La programmazione asincrona mostra tutti i suoi benefici se tra la chiamata asincrona e il pooling vengono effettuate altre computazioni meglio ancora se asincrone anche loro!
ecco un esempio
codice:
protected async void Button3_Click(object sender, EventArgs e)
{
DateTime inizio = DateTime.Now;
ServiceReference1.WebService1SoapClient ws = new ServiceReference1.WebService1SoapClient();
var r1 = ws.HelloWorldAsync();
var r2 = ws.HelloWorldAsync();
var r3 = ws.HelloWorldAsync();
await Task.WhenAll(r1, r2, r3);
PlaceHolder2.Controls.Add(
new Label { Text = "Risultato asincrono:
" + r1.Result.Body.HelloWorldResult + "
" });
PlaceHolder2.Controls.Add(
new Label { Text = r2.Result.Body.HelloWorldResult + "
" });
PlaceHolder2.Controls.Add(
new Label { Text = r3.Result.Body.HelloWorldResult + "
" });
PlaceHolder2.Controls.Add(
new Label { Text = "Tempo: " + (DateTime.Now - inizio).Seconds + "
" });
}
Qui vengono lanciati tre task asincroni che verranno eseguiti in parallelo. Il pooling viene effettuato alla fine poco prima del momento in cui servono i risultati. Il lavoro che normalmente avrebbe impiegato 15 secondi viene svolto in 5 secondi.
I metodi asincroni restituiscono l'oggetto di sincronizzazione che vengono passati al metodo WhenAll della classe task. Anche qui la parola chiave await rende la chiamata a WhenAll più pulita rispetto a come sarebbe stato prima di .net 4.5.