使用Task.ContinueWIth进行异步方法回调?

时间:2012-10-25 07:07:18

标签: c# asynchronous async-await c#-5.0

我有一个方法可以通过HttpClient提取一些HTML,如下所示:

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);

但是,我无法正确理解语法,也不确定这是否适合处理它。

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

甚至

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

答案 1 :(得分:1)

您已关闭,但ContinueWith()Task作为参数接受委托,因此您可以执行以下操作:

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

通常,您应该谨慎使用Resultasync,因为Result会阻止Task尚未完成。但在这种情况下,您确定Task已完成,Result将无法阻止。