2012-10-25 93 views
3

我有拉通過HttpClient的,像這樣的一些HTML的方法:帶有Task.ContinueWIth的異步方法回調?

public static HttpClient web = new HttpClient(); 
public static async Task<string> GetHTMLDataAsync(string url) 
{      
    string responseBodyAsText = ""; 
    try 
    { 
     HttpResponseMessage response = await web.GetAsync(url); 
     response.EnsureSuccessStatusCode(); 
     responseBodyAsText = await response.Content.ReadAsStringAsync(); 
    } 
    catch (Exception e) 
    { 
     // Error handling 
    } 

    return responseBodyAsText; 
} 

我有一個看起來像這樣一種方法:

private void HtmlReadComplete(string data) 
{ 
    // do something with the data 
} 

我想能夠調用GetHTMLDataAsync然後讓它在讀取html時在UI線程上調用HtmlReadComplete。我天真地以爲這可能在某種程度上與東西看起來像

GetHTMLDataAsync(url).ContinueWith(HtmlReadComplete); 

完成,但是,我不能得到正確的語法,我也不是甚至不確定這是來處理它的適當方式。

在此先感謝!

回答

1
public async void ProcessHTMLData(string url) 
{ 
    string HTMLData = await GetHTMLDataAsync(url); 
    HTMLReadComplete(HTMLData); 
} 

甚至

public async void ProcessHTMLData(string url) 
{ 
    HTMLReadComplete(await GetHTMLDataAsync(url)); 
} 
+0

當然。很明顯,我沒有看到它!謝謝。 – user1142433

1

你接近,但ContinueWith()需要委託具有Task作爲參數,所以你可以做:

GetHTMLDataAsync(url).ContinueWith(t => HtmlReadComplete(t.Result)); 

通常情況下,你要小心使用Result連同async,因爲Result如果Task尚未完成,則會阻止。但在這種情況下,您肯定知道Task已完成,您不會阻止Result