Поделиться через


Выбор момента реализации асинхронного шаблона на основе событий

Асинхронный шаблон, основанный на событиях, предоставляет шаблон для демонстрации асинхронного поведения класса. При внедрении этого шаблона .NET определяет два шаблона для предоставления асинхронного поведения: асинхронного шаблона на System.IAsyncResult основе интерфейса и шаблона на основе событий. В этой статье описывается, когда это подходит для реализации обоих шаблонов.

Дополнительные сведения об асинхронном программировании с IAsyncResult помощью интерфейса см. в статье "Асинхронная модель программирования" (APM).

Общие принципы

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

Замечание

Редко встречается, когда IAsyncResult шаблон реализуется без реализации шаблона, основанного на событиях.

Руководящие принципы

В следующем списке описаны рекомендации по реализации асинхронного шаблона на основе событий.

  • Используйте шаблон на основе событий в качестве API по умолчанию для предоставления асинхронного поведения для класса.

  • Не предоставляйте шаблон IAsyncResult в случаях, когда класс в основном используется в клиентском приложении, например, в Windows Forms.

  • Предоставлять IAsyncResult шаблон можно только в том случае, если это необходимо для удовлетворения ваших требований. Например, для обеспечения совместимости с существующим API может потребоваться предоставить IAsyncResult шаблон.

  • Не предоставляйте IAsyncResult шаблон без предоставления событийного шаблона.

  • Если вам необходимо раскрыть IAsyncResult шаблон, сделайте это в качестве опции для продвинутых пользователей. Например, если вы создаете прокси-объект, создайте шаблон на основе событий по умолчанию с возможностью создания IAsyncResult шаблона.

  • Создайте реализацию шаблона, основанного на событиях, на основе реализации шаблона IAsyncResult.

  • Избегайте использования как событийного шаблона, так и шаблона IAsyncResult в одном и том же классе. Выявление шаблона на основе событий для классов "более высокого уровня" и шаблона IAsyncResult для классов "более низкого уровня". Например, сравните шаблон на основе событий для WebClient компонента с шаблоном IAsyncResultHttpRequest класса.

    • Раскрыть шаблон, основанный на событиях, и шаблон IAsyncResult в рамках одного класса, когда это необходимо для обеспечения совместимости. Например, если вы уже выпустили API, использующий IAsyncResult шаблон, необходимо сохранить IAsyncResult шаблон для обратной совместимости.

    • Представьте шаблон на основе событий и шаблон IAsyncResult в одном классе, если сложность полученной объектной модели перевешивает преимущества раздельных реализаций. Лучше предоставлять оба шаблона в одном классе, чем избегать предоставления шаблона на основе событий.

    • Если необходимо подвергать оба шаблона на основе событий и IAsyncResult шаблон в одном классе, установите EditorBrowsableAttribute на Advanced для обозначения реализации IAsyncResult шаблона как расширенной функции. Это указывает средам разработки, таким как Visual Studio IntelliSense, не отображать IAsyncResult свойства и методы. Эти свойства и методы по-прежнему полностью доступны для использования, но разработчик, работающий с IntelliSense, имеет более четкое представление API.

Критерии предоставления шаблона IAsyncResult в дополнение к шаблону на основе событий

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

Существуют три сценария, которые шаблон на основе событий не обрабатывает так же хорошо, как шаблон IAsyncResult.

  • Блокировка ожидания по одному IAsyncResult

  • Блокировка ожидания для многих IAsyncResult объектов

  • Опрос по завершению IAsyncResult

Вы можете решить эти сценарии, используя шаблон на основе событий, но это более затруднительно, чем использование шаблона IAsyncResult.

Разработчики часто используют IAsyncResult шаблон для служб, которые обычно имеют очень высокие требования к производительности. Например, опрос на завершение сценария — это высокопроизводительная серверная техника.

Кроме того, шаблон на основе событий менее эффективен, чем IAsyncResult шаблон, так как он создает больше объектов, особенно EventArgsиз-за синхронизации между потоками.

В следующем списке показаны некоторые рекомендации, которые следует выполнить, если вы решите использовать IAsyncResult шаблон:

  • Использовать шаблон IAsyncResult следует только в случае, если требуется поддержка объектов WaitHandle или IAsyncResult.

  • Предоставляйте шаблон IAsyncResult только если у вас есть существующий API, использующий шаблон IAsyncResult.

  • Если у вас уже есть API, основанный на шаблоне IAsyncResult, рассмотрите возможность добавления шаблона, основанного на событиях, в следующем выпуске программы.

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

См. также