Простейшая реализация шаблона await
public class MyAwaitableType
{
public MinimalAwaiter GetAwaiter()
{
return new MinimalAwaiter();
}
public class MinimalAwaiter : INotifyCompletion
{
public bool IsCompleted => true;
public string GetResult() => "This is a result";
public void OnCompleted(Action continuation)
{
throw new NotImplementedException();
}
}
}
Листинг 17.15 показывает минимальную рабочую реализацию шаблона await. Она чрезмерно упрощена, так как всегда завершается синхронно, поэтому ее метод OnCompleted ничего не делает. Фактически при использовании шаблона await этот метод никогда не будет вызываться, поэтому у меня он вызывает исключение. И хотя этот пример крайне прост, он служит прекрасной иллюстрацией того, что делает await
Различие между этими интерфейсами и их соответствующими методами заключается в том, что первый требует, чтобы ожидающий передавал текущий контекст выполнения целевому методу, а последний — нет.