0

据我了解,为了使用,await我必须在一个标记为async. 如果是这种情况,我可以使用awaitanyTask<Thing>同步检索Task's 结果的值。

Task<bool> task = new Task<bool>(() => false);
task.Start();

int result = await task;

为此,我需要在一个标有async.

在这里我想问的是,asyncasync.

另外,这两者有什么区别?

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;
}

await我都可以在方法内部使用它们async

var res1 = await Foo();
var res2 = await Foo2();

唯一的区别是它的身体Foo2可以使用await,而Foo不能吗?

4

2 回答 2

3

它只是提醒编译器该方法可能包含等待表达式。这使它能够对方法返回值进行一致性检查。并启用编译器内置的重写逻辑,使其将方法转换为隐藏类。

如果您实际上没有在方法主体中使用await运算符,则不需要进行这种重写,也不需要async关键字。如果您仍然使用异步,那么您将收到一个良性警告(CS1998),指出您的代码可能不是您打算编写的。一个很好的诊断。

于 2013-10-12T16:16:51.847 回答
2

关键字的主要目的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 中这也是有效的,除非并且直到您在异步方法中使用它),如果在 c# 5.0await中添加为 a会发生什么?reserved keyword你的代码不会编译。这将是一个突破性的变化。

因此,为了保持向后兼容性,语言设计者选择将await其作为上下文关键字。因此,下一个问题await将是一个contextual keyword,但这里的上下文是什么?

好吧,async关键字来了,存在async只是启用await关键字。它也使编译器也向AsyncStateMachineAttribute方法发出。

async假设您已经知道或者超出了问题的重点,我没有谈论方法是如何转变的。

于 2013-10-12T17:29:00.227 回答