Ho un webservice scritto in Yii (framework php).Come posso usare async/attendi per chiamare un webservice?
Uso C# e Visual Studio 2012 per sviluppare un'applicazione WP8. Ho aggiunto un riferimento di servizio al mio progetto (Aggiungi riferimento al servizio). Quindi sono in grado di utilizzare le funzioni di webservice.
client = new YChatWebService.WebServiceControllerPortTypeClient();
client.loginCompleted += client_loginCompleted; // this.token = e.Result;
client.loginAsync(this.username, this.password);
client.getTestCompleted += client_getTestCompleted;
client.getTestAsync(this.token);
funzione getTestAsync
e loginAsync
ritorno void
ed entrambi sono asincroni. È possibile che le funzioni restituiscano Task<T>
? Vorrei utilizzare le parole chiave async
/await
nel mio programma.
Risposta:
Grazie per il vostro aiuto.
Il seguente codice sembra funzionare.
internal static class Extension
{
private static void TransferCompletion<T>(
TaskCompletionSource<T> tcs, System.ComponentModel.AsyncCompletedEventArgs e,
Func<T> getResult)
{
if (e.Error != null)
{
tcs.TrySetException(e.Error);
}
else if (e.Cancelled)
{
tcs.TrySetCanceled();
}
else
{
tcs.TrySetResult(getResult());
}
}
public static Task<loginCompletedEventArgs> LoginAsyncTask(this YChatWebService.WebServiceControllerPortTypeClient client, string userName, string password)
{
var tcs = new TaskCompletionSource<loginCompletedEventArgs>();
client.loginCompleted += (s, e) => TransferCompletion(tcs, e,() => e);
client.loginAsync(userName, password);
return tcs.Task;
}
}
mi chiamano in questo modo
client = new YChatWebService.WebServiceControllerPortTypeClient();
var login = await client.LoginAsyncTask(this.username, this.password);
Basta modificare il tipo di restituzione vuoto in Attività, quindi è possibile chiamare attendere client.loginAsync (this.username, this.password); –
@NickBray E quindi non funzionerà perché non si sta effettivamente restituendo un'attività completata al momento giusto ... – Servy
http://msdn.microsoft.com/en-us/library/hh524395.aspx –