【发布时间】:2015-09-04 02:15:53
【问题描述】:
我有一个关于 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();
}
如果最后没有等待,至少一切对我来说都是有意义的——因为我会返回一个可能仍有工作要做的真正任务......
【问题讨论】:
-
简而言之:
Task返回一个string。该方法返回Task。 -
啊是的...让我重命名它
-
是什么让您认为
GetWeatherAsync()没有返回Task<string>?尝试在没有async运算符的情况下调用它,您将得到一个Task<string>对象。
标签: c# .net asynchronous async-await