C# 当返回类型为Task<;时,为什么该方法返回字符串;字符串>;?
我有一个关于C#中异步编程的问题。我想知道为什么返回类型为Task的函数必须返回字符串。 所以,即使我返回了一个字符串,它也会再次被包装到一个任务中——这是为什么 问题是我必须向学生解释这些东西。即使我刚刚等待函数返回的结果,将返回的字符串包装到任务对象中的原因是什么?我认为await语句会阻止方法的继续,直到结果到达为止-这意味着在函数调用(await GetWeatherAsync())时,将不会有任何等待,因为结果已经在那里了 以下是我的示例代码:C# 当返回类型为Task<;时,为什么该方法返回字符串;字符串>;?,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,我有一个关于C#中异步编程的问题。我想知道为什么返回类型为Task的函数必须返回字符串。 所以,即使我返回了一个字符串,它也会再次被包装到一个任务中——这是为什么 问题是我必须向学生解释这些东西。即使我刚刚等待函数返回的结果,将返回的字符串包装到任务对象中的原因是什么?我认为await语句会阻止方法的继续,直到结果到达为止-这意味着在函数调用(await GetWeatherAsync())时,将不会有任何等待,因为结果已经在那里了 以下是我的示例代码: static async voi
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();
}
静态异步void下载()
{
//我刚刚在函数调用中等待了结果。为什么此时我必须再次这样做?
WriteLine(等待GetWeatherAsync());
}
私有静态异步任务GetWeatherAsync()
{
HttpClient=新的HttpClient();
任务t=client.GetAsync(“http://localhost:59534/WeatherService.svc/rest?weekDay=Monday");
HttpResponseMessageServerResponse=等待t;
return wait serverResponse.Content.ReadAsStringAsync();
}
如果没有最后的等待,至少对我来说一切都是有意义的——因为我会返回一个可能还有工作要做的真实任务…,因为异步方法不返回值。当计算完成时,它们返回承诺返回值。方法在计算完成之前,即实际字符串生成之前立即返回。,因为异步方法不返回值。当计算完成时,它们返回承诺返回值。方法在计算完成之前,即在实际字符串生成之前立即返回。当您将一个方法标记为
异步任务时,您正在告诉它的使用者,该方法承诺在将来返回一个字符串
我想你被wait
关键字挂断了。wait
关键字允许您暂停方法的执行,直到等待的任务完成,并将其(对使用者)视为同步方法
您可以有一个简单的异步方法,如下所示:
static async Task<string> SayHi()
{
return "hi";
}
或
SayHi()//返回一个任务
除了等待
的所有好处外,它还可以在完成后为您打开任务
,这是有意义的,因为它等待您的任务
完成,剩下的就是结果。当您将一个方法标记为异步任务
时,您是在告诉它的使用者,该方法承诺在将来返回一个字符串
我想你被wait
关键字挂断了。wait
关键字允许您暂停方法的执行,直到等待的任务完成,并将其(对使用者)视为同步方法
您可以有一个简单的异步方法,如下所示:
static async Task<string> SayHi()
{
return "hi";
}
或
SayHi()//返回一个任务
除了等待
的所有好处外,它还可以在完成时为您打开任务
,这很有意义,因为它等待任务完成,剩下的就是结果。简而言之,任务
返回一个字符串。该方法返回任务
。。。让我重新命名它是什么让你认为GetWeatherAsync()
没有返回任务
?尝试在不使用async
操作符的情况下调用它,您将得到一个Task
对象。请阅读更多有关它的信息-简而言之,任务
返回一个字符串
。该方法返回任务
。。。让我重新命名它是什么让你认为GetWeatherAsync()
没有返回任务
?尝试在不使用async
运算符的情况下调用它,您将得到一个Task
对象。请阅读有关它的详细信息-因此您是说GetWeatherAsync()方法在等待服务器响应后立即返回。。。叫什么名字?这是因为MSDN说:“wait运算符应用于异步方法中的任务,以暂停该方法的执行,直到等待的任务完成。”@funkypeant您可以不使用await@FunkyPeanut您可以将代码行等效为:<代码>任务TMP= GETWeaReTaseCyc();控制台写入线(等待tmp),因此对GetWeatherAsync
的调用在控制台.WriteLine()
之前完成,然后控制台.WriteLine
必须等待调用的结果(等待
)啊!我可以发誓我以前在没有等待的情况下尝试时出错了。。。现在我明白了。。。当我只想返回一个任务时,我必须从函数中删除“async”关键字,对吗?@funkypeant如果你的方法包含wait
关键字,那么它必须包含async
修饰符。async
修饰符将该方法标记为必须在编译期间修改的方法(它在状态机中转换),因此您是说方法GetWeatherAsync()在等待服务器响应之后立即返回。。。叫什么名字?这是因为MSDN说:“wait运算符应用于异步方法中的任务,以暂停该方法的执行,直到等待的任务完成。”@funkypeant您可以不使用await@FunkyPeanut您可以将代码行等效为:<代码>任务TMP= GETWeaReTaseCyc();控制台写入线(等待tmp),因此对GetWeatherAsync
的调用在控制台.WriteLine()
之前完成,然后控制台.WriteLine
必须等待调用的结果(等待
)啊!我可以发誓我以前在没有等待的情况下尝试时出错了。。。现在我明白了。。。当我只想返回一个任务时,我必须从函数中删除“async”关键字ri
SayHi() //returns a Task<string>