IAwaitable.OnCompleted提供的授权代表的目标

时间:2013-01-24 10:22:51

标签: c# async-await

我的设置如下:

class mytype
{
   Awaiter GetAwaiter() { ... }
}

class Awaiter : INotifyCompletion
{
  bool IsCompleted { get { return false; } }
  void GetResult () { }

  void OnCompleted(Action continuation)
  {
    //that's the continuation in focus
  }
}

//somewhere else:
async Task MyMethod()
{
  //here instructions for 1st state 
  await new mytype();
  //here instructions for 2nd state 
  await new mytype();
  //here instructions for 3rd state 
}

我错了,或者是我从CLR(在同一方法中)获得的委托总是或多或少相同的委托但我正在等待的实例是不同的?由于async关键字,C#编译器将MyMethod转换为具有3种状态的FSM。每当我在C#中等待该方法中的某些内容时,就会调用FSM的MoveNext-Method。但是FSM会跟踪状态本身,因此它知道它所处的最后状态,因此它可以进入下一个状态(并执行与新状态相关的指令)。

基本上我理解一个名为 continuation 的委托的调用内部归结为调用适当的FSM-Type的MoveNext方法。似乎没什么大不了的 - 或者我错了吗?

1 个答案:

答案 0 :(得分:1)

是的,你的理解是正确的。当编译器必须将MyMethod()重写到状态机而不是在运行时期间,就会发生“大魔术”。

有关状态机的外观及其工作原理的更多信息,请阅读Jon Skeet的Eduasync系列文章Generated code from a simple async method。该文章介绍了其中一个Async CTP生成的代码,后续文章介绍了此后的更改:Changes between the Async CTP and the Visual Studio 11 PreviewChanges between the VS11 Preview and the Visual Studio 11 Beta