如何正确使用HttpClient与async/await?

use*_*993 4 c# task-parallel-library async-await

我在以下代码中遇到两个错误:

public async Task<string> TestDownloadTask()
{
    HttpResponseMessage response = null;

    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(@"https://api.nasa.gov/planetary/apod");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        response.EnsureSuccessStatusCode();
        response = await client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY");
    }

    return response.Content;
}
Run Code Online (Sandbox Code Playgroud)

我越来越:

  • 无法在"await"行上等待'System.Threading.Tasks.Task'
  • 无法将表达式类型'System.Net.Http.Content'转换为返回类型'string'

我一直在尝试编写上面的代码,它将从Web服务下载一个字符串,但似乎有很多关于如何使用async和await以及如何使用HttpClient的冲突信息,我不知道是什么问题用我编写的代码.

我哪里出错了,我应该怎么做呢?

Ngu*_*ien 8

此方法client.GetStringAsync返回Task<string>

public Task<string> TestDownloadTask()
{
    using (HttpClient client = new HttpClient())
    {
        client.BaseAddress = new Uri(@"https://api.nasa.gov/planetary/apod");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        // You don't need await here
        return client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY");
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用上述功能:

public async void SomeMethod()
{
    // await to get string content
    string mystring = await TestDownloadTask();
}
Run Code Online (Sandbox Code Playgroud)

  • @ user9993使用静态类型语言的一个好处是你可以使用类型系统本身作为文档(如果你有一个好的IDE,如Visual Studio),并忽略在线文档.如果右键单击"GetStringAsync"并选择转到定义,您应该能够看到方法想要什么以及返回什么. (3认同)