当返回类型为Task <string>时,为什么该方法返回一个字符串?

时间:2015-06-18 12:30:08

标签: c# .net asynchronous async-await

我对C#中的异步编程有疑问。我想知道为什么返回类型为Task的函数必须返回一个字符串。 因此,即使我返回了一个字符串,它也会再次被包装到一个Task中 - 为什么会这样?

问题是我必须向学生解释这些内容。将返回的字符串包装在Task对象中的原因是什么,即使我刚刚等待函数返回的结果?我认为await语句会阻止方法的继续,直到结果到达 - 这意味着在函数调用(等待GetWeatherAsync())时,没有什么可以等待,因为结果已经存在...

以下是我的示例代码:

    static async void Download()
    {
        //I have just awaited the result in the function call. Why do I have to do this again at this point?
        Console.WriteLine(await GetWeatherAsync());
    }

    private static async Task<string> GetWeatherAsync()
    {
        HttpClient client = new HttpClient();
        Task<HttpResponseMessage> t = client.GetAsync("http://localhost:59534/WeatherService.svc/rest?weekDay=Monday");
        HttpResponseMessage serverResponse = await t;

        return await serverResponse.Content.ReadAsStringAsync();
    }

如果没有等待到最后,一切对我来说都是有意义的 - 因为我会回复一个可能仍有工作要做的真正任务......

2 个答案:

答案 0 :(得分:4)

当您将方法标记为async Task<string>时,您告诉消费者该方法将来会向您返回string

我认为你已经挂断了await关键字了。 await关键字允许您暂停执行方法,直到等待任务完成,并将其作为同步方法对待(作为消费者)。

您可以使用async方法:

static async Task<string> SayHi()
{
    return "hi";
}

你可以使用:

await SayHi() //returns a string

SayHi() //returns a Task<string>

以及await的所有好处,它还会在完成后为您Task打开,这是有道理的,因为它等待您Task完成,剩下的就是结果。

答案 1 :(得分:2)

因为异步方法不返回值。当计算完成时,它们返回承诺返回值。方法在计算完成之前立即返回,在生成实际字符串之前返回。