假设我有一个方法void
返回类型,我需要await
在此方法中的操作上。
public void someOperation()
{
//dostuff
var res = await someOtherOperation();
//do some other stuff that needs res.
}
当我尝试编译这段代码时,我收到错误消息someOperation
必须声明async
。我不明白为什么。我明白如果该方法有返回值为什么会这样,但当它是void
。或者甚至在等待操作对方法的返回值没有影响的情况下。
这已经被问为一部分this https://stackoverflow.com/questions/14455293/async-and-await问题,但我没有找到我正在寻找的答案。This guy https://stackoverflow.com/a/14459475/279982仅提到:
async 关键字启用await 关键字。所以任何使用await的方法
必须标记为异步。
- 首先,我不确定这意味着什么
async
关键字启用await
关键词。
- 其次,重申我的问题,我不确定为什么会这样required?
异步方法必须被标记async
. The async
and await
关键字配对在一起,主要是出于向后兼容性的原因;await
是一个有效的标识符(不是关键字),因此当它被添加到语言中时,他们还添加了async
关键词。
或者,他们could已经使用了多字关键字await
, 例如await for
。然而,语言设计团队决定采用配对,因为它清楚明确地标记了所有async
方法 - 编译器和人类都更容易解析。
我有一个关于该主题的博客文章 http://blog.stephencleary.com/2011/09/async-ctp-why-do-keywords-work-that-way.html,链接到埃里克·利珀特 (Eric Lippert) 的权威博客文章 http://blogs.msdn.com/b/ericlippert/archive/2010/11/11/whither-async.aspx以及中的讨论博客评论 http://blogs.msdn.com/b/ericlippert/archive/2010/10/29/asynchronous-programming-in-c-5-0-part-two-whence-await.aspx, Channel9 论坛 http://channel9.msdn.com/Forums/Coffeehouse/Why-is-the-async-keyword-needed, MSDN 论坛 http://social.msdn.microsoft.com/Forums/en-US/async/thread/75493675-4a39-4958-a493-ad8a96f8a19d, 而且当然就在 Stack Overflow 上 https://stackoverflow.com/questions/9225748/why-does-the-async-keyword-exist.
请注意,natural返回类型async
没有结果值的方法是Task
, not void
. void
是一个不自然的返回类型async
方法。因此,当看到“等待运算符必须位于异步方法内”错误时,您的默认反应应该是标记它async
and更改返回类型void
to Task
:
public async Task someOperationAsync()
{
//dostuff
var res = await someOtherOperationAsync();
//do some other stuff that needs res.
}
这遵循我的最佳实践之一关于该主题的 MSDN 文章 http://msdn.microsoft.com/en-us/magazine/jj991977.aspx: avoid async void
. async void
was allowed由事件处理程序的语言设计者(或代码)逻辑上事件处理程序,例如ICommand.Execute
);任何其他用法都会引起问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)