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

时间:2015-06-28 17:38:38

标签: c# async-await task-parallel-library

我为以下代码收到两个错误:

CC = /usr/bin/g++
LD = /usr/bin/g++
PG_HOMEDIR = /Library/PostgreSQL/9.4/
CPPFLAGS = -O3
CPPFLAGS += -I${PG_HOMEDIR}/include

...

LOAD_OBJS = bulkload.o loadgraph/load.o util/util.o util/graphutil.o db/pgsql_db.o config.o orthology/ortholog.o io/graphio.o io/gdf.o

我得到了:

  • 无法等待System.Threading.Tasks.Task'在" await"线
  • 无法转换表达式' System.Net.Http.Content'返回类型'字符串'

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

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

2 个答案:

答案 0 :(得分:6)

此方法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");
    }
}

使用上述功能:

public async void SomeMethod()
{
    // await to get string content
    string mystring = await TestDownloadTask();
}

答案 1 :(得分:2)

更改为

return await client.GetStringAsync("?concept_tags=True&api_key=DEMO_KEY");

return await response.Content.ReadAsStringAsync();