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

Fun*_*nut 2 .net c# asynchronous async-await

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

问题是我必须向学生解释这些东西。即使我刚刚等待函数返回的结果,将重行字符串包装在Task对象中的背后是什么原因呢?我以为await语句会阻止方法的继续直到结果到达-这意味着在函数调用(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();
    }
Run Code Online (Sandbox Code Playgroud)

如果没有最后的等待,一切对我来说至少是有意义的-因为我要返回一个可能仍有工作要做的真实任务...

Jon*_*lis 5

当您async Task<string>在向用户告知方法时标记方法时,该方法承诺string将来会返回a 。

我认为您已经迷上了await关键字。该await关键字可以暂停方法的执行,直到等待任务完成后,它作为一个同步的方法治疗(给消费者)。

您可以使用一个简单的异步方法:

static async Task<string> SayHi()
{
    return "hi";
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方式消费:

await SayHi() //returns a string
Run Code Online (Sandbox Code Playgroud)

要么

SayHi() //returns a Task<string>
Run Code Online (Sandbox Code Playgroud)

连同的所有好处await,它还会Task在完成时为您打开包装,这很有意义,因为它在等待您Task完成时,剩下的就是结果。