2012-11-28 53 views
0

我目前做給WCF調用的方法是沼澤標準事件,異步樣式(例如)異步WCF調用與MonoDroid的

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

這工作得很好,但可怕有時慢,也是很麻煩的然後你需要另一種方法來處理結果。

有沒有一種方法可以更接近它在Win8上完成的方式?

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

    // deal with the code back 
    return true; 
} 

感謝

保羅

回答

0

你可以write your own *TaskAsync extension methods

如果您的代理有*Begin/*End方法,你可以使用TaskFactory.FromAsync

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

否則,您必須使用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

感謝。這對我原來的方式會有什麼很大的速度差異嗎? – Nodoid

+0

不可以。您正在與另一個包裝一個異步API;如果有的話,它會慢一點。好處是'基於任務的API可以與'async'無縫地使用,所以你的代碼更加清晰。 –