繁体   English   中英

在C#5.0中将方法标记为异步有什么后果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM