2012-10-25 3 views
3

J'ai une méthode qui tire un certain HTML via le HttpClient comme ceci:Rappel de méthode asynchrone avec 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; 
} 

J'ai une autre méthode qui ressemble à ceci:

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

Je voudrais pouvoir appeler GetHTMLDataAsync puis Faites-le appeler HtmlReadComplete sur le thread de l'interface utilisateur lorsque le code HTML a été lu. Je pensais naïvement cela pourrait en quelque sorte être fait avec quelque chose qui ressemble

GetHTMLDataAsync(url).ContinueWith(HtmlReadComplete); 

Mais, je ne peux pas obtenir la syntaxe correcte, je ne suis pas même sûr que ce la façon appropriée de le manipuler.

Merci d'avance!

Répondre

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

ou même

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

Bien sûr. Tellement évident que je ne l'ai pas vu! Je vous remercie. – user1142433

1

Vous êtes proche, mais un délégué ContinueWith() prend avec Task comme paramètre, de sorte que vous pouvez faire:

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

Normalement, vous devriez faire attention en utilisant Result avec async, car Result bloque si le Task n'a pas encore fini. Mais dans ce cas, vous savez avec certitude que le est terminé, vous Result ne bloquera pas.