[英]What are the consequences of marking a method async in C# 5.0?
据我了解,为了使用await
我必须处于标记为async
的方法内部。 如果是这种情况,我可以在任何Task<Thing>
上使用await
来某种程度上同步检索Task
结果的值。
Task<bool> task = new Task<bool>(() => false);
task.Start();
int result = await task;
为此,我需要使用async
标记的方法。
我想请问这里是究竟是什么意思async
,什么是标记有方法的后果async
。
另外,这两者之间有什么区别?
Task<bool> Foo() {
var task = new Task<bool>(() => false);
task.Start();
return task;
}
async Task<bool> Foo2() {
var task = new Task<bool>(() => false);
task.Start();
return await task;
}
我都可以在async
方法async
它们与await
一起使用。
var res1 = await Foo();
var res2 = await Foo2();
这是唯一的区别Foo2
可以利用await
在它的身上,而Foo
不能?
它只是警告编译器该方法可能包含等待表达式。 这使它能够对方法返回值进行一致性检查。 并启用内置于编译器中的重写逻辑,从而使该方法将方法转换为隐藏类。
如果您实际上未在方法主体中使用await运算符,则无需进行这种重写,也不需要async关键字。 如果仍然使用异步 ,则将收到一个警告消息(CS1998),指出您的代码可能不是您打算编写的内容。 一个很好的诊断。
async
关键字的主要目的是避免与C#5.0之前的代码冲突。换句话说,我们可以说是为了保持Backword的兼容性。
此前C#5.0,你也可以使用标识符/类型的await
void Somemethod()
{
int await = 5;//identifier
await myAwait = new await();//type
}
上面的代码在C#5.0之前是完全有效的(在C#5.0中也是有效的,除非并且直到您在async方法中使用它为止),如果在c#5.0中将await
作为reserved keyword
添加会发生什么? 您的代码将无法编译。 那将是一个巨大的变化。
因此,要保持选择,使落后的兼容性语言设计者await
的上下文关键字。 因此,下一个问题出现await
将是一个contextual keyword
,但这里是什么背景?
好吧,这里有async
关键字, async
存在只是启用了await
关键字。 并使编译器也AsyncStateMachineAttribute
方法发出AsyncStateMachineAttribute
。
假设您已经知道或超出了问题的范围,那么我没有谈论有关如何转换async
方法的任何事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.