在 C 中将 Await 表达式作为方法参数#

Await expressions as method parameters in C#

提问人:DP3PO 提问时间:7/24/2022 最后编辑:NimanthaDP3PO 更新时间:11/14/2023 访问量:164

问:

Microsoft 文档教程向我介绍了以下代码:

var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(await streamTask);

我熟悉并如何使用它们,或者我是这么想的。本教程提到这是一个使用“await 表达式”的示例 - 这很好,毕竟,表达式本身看起来并不那么奇怪,但我还没有找到另一个像这样的 C# 代码的单一示例 - 其中 await 表达式被传递给方法 - 任何地方。这里的 await 关键字几乎看起来像是用作参数修饰符,例如 ref、out、in。asyncawait

所以我的问题是,这是一个新功能,是很少使用,还是对我来说只是新功能?它的功能似乎显而易见、直观且有用,但正如我提到的,我还没有在任何地方找到类似代码的另一个示例。

我正在浏览的教程:

https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/console-webapiclient

C# 异步 async-await 任务 参数传递

评论

4赞 Charlieface 7/24/2022
完全合法,在很多地方都看到过。通常不会直接传递这样的值,因为如果看不到中间值,就很难调试。
0赞 Klaus Gütter 7/24/2022
streamTask可能是类型 ;则为 .将其拆分为两个语句可能更清楚:.这里没有魔法。Task<Stream>await streamTaskStreamvar stream = await streamTask; var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(stream);
3赞 Jon Skeet 7/24/2022
await只是一个运算符 - 而不是像 等修饰符。这里没有什么新鲜事,和其他人一样,我在很多地方都看到过这种情况。outin

答:

4赞 Stephen Cleary 7/24/2022 #1

我还没有在任何地方找到任何此类 C# 代码的另一个单一示例 - 其中 await 表达式被传递给方法。

这种情况并不少见。正如另一位评论者所指出的,出于可调试性或可读性的原因,关键字通常被拆分为单独的行。但是我已经见过很多次这种用法了。await

表达式的另一种常见模式是使用括号提取部分结果:await

var x = (await SomethingAsync()).Property;

这里的 await 关键字几乎看起来像是用作参数修饰符,例如 ref、out、in。

我认为它看起来只是因为它不熟悉,并且像编辑器中的关键字一样着色。 - like - 是存在于表达式中的关键字。awaitnew

所以我的问题是,这是一个新功能,是很少使用,还是对我来说只是新功能?

对你来说是新的。

在最初的 CTP 中,表达式无法正常工作,必须拆分为单独的语句。但是,在官方支持发布之前,该限制已被删除,因此从第一天起就支持表达式(忽略预发布)。asyncawaitasyncawait

评论

0赞 DP3PO 7/25/2022
谢谢!当我找不到另一个例子时,它通过我循环了一圈,但我很感激你的答案,你花时间解释清楚。
0赞 tymtam 7/25/2022
当使用表达体成员时,我们有一些:(await SomethingAsync()).Propertypublic X GetXAsync() => (await GetAsync()).X