【问题标题】:async method callback with Task.ContinueWIth?Task.ContinueWIth 的异步方法回调?
【发布时间】:2012-10-28 01:16:18
【问题描述】:

我有一个方法可以通过 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);

但是,我无法获得正确的语法,我什至不确定这是处理它的适当方法。

提前致谢!

【问题讨论】:

    标签: c# asynchronous async-await c#-5.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));
    }
    

    【讨论】:

      【解决方案2】:

      你已经接近了,但是ContinueWith() 接受一个以Task 作为参数的委托,所以你可以这样做:

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

      通常,您应该小心使用Result 和async,因为如果Task 尚未完成,Result 会阻塞。但是在这种情况下,你肯定知道Task 是完整的,你Result 不会阻塞。

      【讨论】:

        猜你喜欢
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多