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

标签 c# .net asynchronous async-await

我有一个关于 C# 异步编程的问题。我想知道为什么返回类型为 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();
    }

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

最佳答案

当您将方法标记为 async Task<string> 时您是在告诉它的消费者该方法 promise 返回给您 string将来。

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

你可以有一个简单的异步方法:

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

您可以使用:

await SayHi() //returns a string

SayHi() //returns a Task<string>

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

关于c# - 为什么当返回类型为 Task<string> 时该方法返回一个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30915401/

相关文章:

c# - 这个 MVC4 API 调用应该是异步的吗?

c# - 为什么调用方方法和异步方法具有相同的线程 ID

c# - C#泛型中Java通配符的等价物是什么

c# - 这可能是 lambda 表达式吗?

c# - 将深度图像与 RGB 图像对齐

c# - ComboBox SelectedValue 属性不起作用

c# - 格式化用户输入的货币

c# - 不明确的类型名称

c# - WebBrowser 将图像复制到剪贴板

javascript - 在导出之前加载异步配置