Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当返回类型为Task<;时,为什么该方法返回字符串;字符串>;?_C#_.net_Asynchronous_Async Await - Fatal编程技术网

C# 当返回类型为Task<;时,为什么该方法返回字符串;字符串>;?

C# 当返回类型为Task<;时,为什么该方法返回字符串;字符串>;?,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,我有一个关于C#中异步编程的问题。我想知道为什么返回类型为Task的函数必须返回字符串。 所以,即使我返回了一个字符串,它也会再次被包装到一个任务中——这是为什么 问题是我必须向学生解释这些东西。即使我刚刚等待函数返回的结果,将返回的字符串包装到任务对象中的原因是什么?我认为await语句会阻止方法的继续,直到结果到达为止-这意味着在函数调用(await GetWeatherAsync())时,将不会有任何等待,因为结果已经在那里了 以下是我的示例代码: static async voi

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