2012-11-28 5 views
0

Ma méthode actuelle de faire un appel à WCF est l'événement standard tourbière, style async (par exemple)Async WCF appel avec MonoDroid

foo.EventArgs += Foo_EventArgsCompleted 
foo.EventArgsAsync(params...) 

cela fonctionne très bien, mais est affreusement parfois lent et est aussi lourde que vous avez alors besoin d'une autre méthode pour gérer les résultats.

Existe-t-il un moyen de coder ceci plus près de la façon dont il est fait sur Win8?

private async foo<bool>() 
{ 
    try 
    { 
    await foo.EventArgsAsync(params...) 
    } 
    catch 
    { 
    // catch here 
    } 

    // deal with the code back 
    return true; 
} 

Merci

Paul

Répondre

0

Vous pouvez write your own *TaskAsync extension methods.

Si votre proxy a *Begin/méthodes *End, vous pouvez utiliser TaskFactory.FromAsync:

public static Task<int> FooTaskAsync(this FooClient client) 
{ 
    return Task<int>.Factory.FromAsync(client.BeginFoo, client.EndFoo, null); 
} 

Sinon, vous devez utiliser TaskCompletionSource:

public Task<int> FooTaskAsync(this FooClient client) 
{ 
    var tcs = new TaskCompletionSource<int>(); 
    client.FooCompleted += (s, e) => 
    { 
    if (e.Error != null) tcs.SetException(e.Error); 
    else if (e.Cancelled) tcs.SetCanceled(); 
    else tcs.SetResult(e.Result); 
    }; 
    client.FooAsync(); 
    return tcs.Task; 
} 
+0

Merci. Cela aura-t-il une grande différence de vitesse par rapport à la façon dont je l'avais initialement? – Nodoid

+0

Non. Vous encapsulez une API asynchrone avec une autre; si quoi que ce soit, ce sera un peu plus lent. L'avantage est que les API 'Task' peuvent être utilisées de façon transparente avec' async', donc votre code est beaucoup plus propre. –