可以对任何提供 GetAwaiter 方法并返回 awaiter 的对象使用 async 关键字。awaiter 用 OnCompleted 方法实现 INotifyCompletion 接口。此方法在任务完成时调用。下面的代码片段不是在任务中使用 await,而是使用任务的 GetAwaiter 方法。Task 类的 GetAwaiter 返回一个 TaskAwaiter。使用 OnCompleted 方法,分配一个在任务完成时调用的本地函数:.
private static void CallerWithAwaiter(){TraceThreadAndTask($"starting {nameof(CallerWithAwaiter)}");TaskAwaiter<string> awaiter = GreetingAsync("Matthias").GetAwaiter();awaiter.OnCompleted(OnCompleteAwaiter);void OnCompleteAwaiter(){Console.WriteLine(awaiter.GetResult());TraceThreadAndTask($"ended {nameof(CallerWithAwaiter)}");}}
starting CallerWithAwaiter in thread 2 and no taskrunning GreetingAsync in thread 3 and task 1running Greeting in thread 3 and task 1Hello,Matthiasended CallerWithAwaiter in thread 3 and no task
编译器把 await 关键字后的所有代码放进 OnCompleted 方法的代码块中来转换 await 关键字。
