Почему нет интерфейса IAwaitable и IAwaiter - PullRequest
5 голосов
/ 07 апреля 2020

Я недавно узнал о возможности иметь настраиваемые ожидаемые типы, и, поскольку этот вопрос и Стивен Тауб , существует несколько требований, чтобы быть ожидаемым типом.

Таким образом, если тип T хочет быть ожидаемым, он должен

  • предоставить метод без параметров GetAwaiter, который возвращает valid awaiter

и если тип A хочет быть действительным ожидающим, он должен

  • реализовать INotifyCompletion интерфейс
  • Предоставить логическое свойство с именем IsCompleted
  • Укажите метод GetResult без параметров, который возвращает void или TResult

Итак, теперь я спрашиваю, требуется ли все, чтобы быть ожидаемым типом, почему Это та часть некоторых интерфейсов, как

public interface INotifyCompletion
{
    bool IsCompleted { get; }
    void OnCompleted(Action continuation);
}

public interface IAwaiter : INotifyCompletion
{
    void GetResult();
}

public interface IAwaitable<TAwaiter> where TAwaiter : IAwaiter
{
    TAwaiter GetAwaiter();
}

public interface IAwaiter<TResult> : INotifyCompletion
{
    TResult GetResult();
}

// this would probably not necessary but would likely help to identify
// awaitables that return a value
public interface IAwaitable<TAwaiter, TResult> where TAwaiter : IAwaiter<TResult>
{
    TAwaiter GetAwaiter();
}

Я также понимаю, что компилятору это не нужно, поскольку он может проверять все это во время компиляции без каких-либо штрафов. Но поскольку для метода OnCompleted() существует интерфейс INotifyCompletion, почему остальные интерфейсы для ожидающих и ожидающих элементов не упакованы в некоторые интерфейсы?

Это, скорее всего, поможет информировать программистов, как это реализовать.

Я также знаю, что можно сделать тип ожидаемым, предоставив метод расширения, который возвращает valid awaiter, но снова почему весь интерфейс ожидающего не упакован в единый интерфейс, но имеет дыры (то есть свойство IsCompleted не является частью какого-либо интерфейса, но требуется)?

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

IAwaiter и IAwaitable доступны интерфейсы, если вы хотите их использовать.

Обратите внимание, что они не обязательны использовать, но если вы чувствуете, что они сделают вашу жизнь проще - не стесняйтесь использовать их.

Это сообщение в блоге может также стоить прочитать.

0 голосов
/ 07 апреля 2020

Я думаю, потому что это нарушит семантику c. async/await - это функция времени компиляции, которая подразумевает, что компилятор должен знать, какой тип ожидающего использовать в сгенерированном автомате состояний, что может быть невозможно при некотором сценарии использования интерфейса ios, подразумевающий полиморфизм во время выполнения при фактическом типе переменной не может быть определено во время компиляции. По сути, это означает, что не все случаи могут быть покрыты интерфейсными ожидающими.

...