Ожидаемый и ожидающий В С# 5.0 Асинхронный

Задача или задача <TResult> объект является ожидаемым, поэтому мы можем использовать ключ ожидания для тех, чье возвращаемое значение - Task или Task <TResult> . Задача или задача <TResult> являются наиболее часто используемым ожидаемым объектом.

Мы также можем определить наш собственный ожидаемый объект. Объект должен иметь квалификацию ниже.

  • Он имеет метод GetAwaiter() (метод экземпляра или метод расширения);
  • Метод GetAwaiter() возвращает awaiter. Объект является awaiter если:
    • Он реализует INotifyCompletion или ICriticalNotifyCompletion  интерфейс;
    • Он имеет IsCompleted, который имеет getter и возвращает логическое значение;
    • у него есть метод GetResult(), который возвращает void или результат.

Мой вопрос в том, почему Microsoft не предоставляла интерфейс для ограничения этих ожидаемых объектов? Текущий метод для реализации ожидаемого объекта немного сложнее.

Ответ 1

Лучше всего ответить на сообщение в блоге Lucian Wischik Почему методы async возвращают задачу?

В резюме (и я не занимаюсь правосудием в блоге, вы должны его прочитать), проблема в том, что Task уже существует, поэтому введение интерфейса будет означать

  • Все внутренние методы необходимо будет изменить на интерфейс, изменить разрыв и, таким образом, почти невозможно, чтобы люди инфраструктуры могли охотно делать.
  • В качестве программиста вам постоянно нужно будет решить, хотите ли вы вернуть Task или интерфейс, решение, которое не имеет большого значения.
  • Компилятору всегда нужен конкретный тип, поэтому даже если вы вернели интерфейс из метода, он все равно будет скомпилирован как Task.

Влияние вышеописанного настолько велико, что не имеет смысла предоставлять интерфейс.

Ответ 2

Это соответствует тому, что они сделали для ключевого слова foreach (см. раздел 8.8.4 спецификации языка С# "Предпросмотр выражение" ).

В основном, это утка-типизация; если тип реализует метод MoveNext и свойство Current, то все, что необходимо для компилятора С#, чтобы знать, как итерации через последовательность, открытую объектом.

Это также относится к инициализаторам коллекций (см. раздел 7.6.10.3 спецификации языка С# "Инициализаторы коллекции" ); единственным требованием является то, что тип реализует System.Collections.IEnumerable интерфейс и имеет метод Add.

Тем не менее ключевое слово await просто придерживается предшествующего прецедента, не требуя конкретных реализаций интерфейса (хотя интерфейсы предоставляют эти методы, если вы выберите их использовать), просто шаблон методов, которые может распознать компилятор.

Ответ 3

Я думаю, что основной причиной является то, что вы заявили в пункте № 1

метод экземпляра или метод расширения

Просто потому, что они хотят дать возможность пользователю сделать объект Awaitable, определив для него метод расширения, следовательно, вы можете сделать объект Awaitable, даже если у вас его нет.

Оформить заказ