Определение, когда следует реализовать асинхронную модель, основанную на событияхDeciding When to Implement the Event-based Asynchronous Pattern

Асинхронная модель на основе событий применяется для предоставления асинхронного поведения класса.The Event-based Asynchronous Pattern provides a pattern for exposing the asynchronous behavior of a class. С момента ее появления .NET Framework определяет две модели для предоставления асинхронного поведения: на основе интерфейса System.IAsyncResult и на основе событий.With the introduction of this pattern, the .NET Framework defines two patterns for exposing asynchronous behavior: the Asynchronous Pattern based on the System.IAsyncResult interface, and the event-based pattern. Эта статья описывает ситуации, в которых вам следует применять ту или иную модель.This topic describes when it is appropriate for you to implement both patterns.

Дополнительные сведения об асинхронном программировании для интерфейса IAsyncResult вы найдете в статье об асинхронной модели программирования (APM).For more information about asynchronous programming with the IAsyncResult interface, see Asynchronous Programming Model (APM).

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

Обычно для всех асинхронных функций лучше применять асинхронную модель на основе событий.In general, you should expose asynchronous features using the Event-based Asynchronous Pattern whenever possible. Но есть несколько требований, которым она не полностью соответствует.However, there are some requirements that the event-based pattern cannot meet. Если они применимы в вашей ситуации, в дополнение к модели на основе событий следует реализовать модель IAsyncResult.In those cases, you may need to implement the IAsyncResult pattern in addition to the event-based pattern.

Примечание

Модель IAsyncResult очень редко реализуется отдельно, без модели на основе событий.It is rare for the IAsyncResult pattern to be implemented without the event-based pattern also being implemented.

РекомендацииGuidelines

Ниже перечислены рекомендации по выбору асинхронной модели на основе событий.The following list describes the guidelines for when you should implement Event-based Asynchronous Pattern:

  • Используйте модель на основе событий в качестве основного API для асинхронных возможностей класса.Use the event-based pattern as the default API to expose asynchronous behavior for your class.

  • Не предоставляйте модель IAsyncResult, если класс используется в основном в клиентском приложении, например Windows Forms.Do not expose the IAsyncResult pattern when your class is primarily used in a client application, for example Windows Forms.

  • Предоставляйте модель IAsyncResult только в тех случаях, когда это необходимо для конкретных требований.Only expose the IAsyncResult pattern when it is necessary for meeting your requirements. Например, модель IAsyncResult может потребоваться для совместимости с уже существующими API.For example, compatibility with an existing API may require you to expose the IAsyncResult pattern.

  • Не предоставляйте модель IAsyncResult отдельно, без модели на основе событий.Do not expose the IAsyncResult pattern without also exposing the event-based pattern.

  • Если потребуется модель IAsyncResult, предоставляйте ее только в качестве дополнительной возможности.If you must expose the IAsyncResult pattern, do so as an advanced option. Например, если вы создаете прокси-объект, создайте модель на основе событий в качестве стандартного варианта, а модель IAsyncResult предоставляйте опционально.For example, if you generate a proxy object, generate the event-based pattern by default, with an option to generate the IAsyncResult pattern.

  • Модели на основе событий следует основывать на вашей реализации модели IAsyncResult.Build your event-based pattern implementation on your IAsyncResult pattern implementation.

  • По возможности не размещайте модель на основе событий и модель IAsyncResult в одном классе.Avoid exposing both the event-based pattern and the IAsyncResult pattern on the same class. Модель на основе событий должна размещаться в классах "более высокого уровня" относительно модели IAsyncResult.Expose the event-based pattern on "higher level" classes and the IAsyncResult pattern on "lower level" classes. Сравните, например, модель на основе событий для компонента WebClient с моделью IAsyncResult в классе HttpRequest.For example, compare the event-based pattern on the WebClient component with the IAsyncResult pattern on the HttpRequest class.

    • Используйте один и тот же класс для предоставления модели на основе событий и модели IAsyncResult только в том случае, если это необходимо для совместимости.Expose the event-based pattern and the IAsyncResult pattern on the same class when compatibility requires it. Например, если вы уже опубликовали API, в котором реализована модель IAsyncResult, ее придется сохранить для обеспечения обратной совместимостиIAsyncResult.For example, if you have already released an API that uses the IAsyncResult pattern, you would need to retain the IAsyncResult pattern for backward compatibility.

    • Также допустимо размещать модель на основе событий и модель IAsyncResult в одном классе в тех случаях, когда сложность объектной модели перевешивает преимущества от раздельной реализации.Expose the event-based pattern and the IAsyncResult pattern on the same class if the resulting object model complexity outweighs the benefit of separating the implementations. Гораздо лучше предоставить обе модели в одном классе, чем вовсе не предоставлять модель на основе событий.It is better to expose both patterns on a single class than to avoid exposing the event-based pattern.

    • Если вам придется разместить модель на основе событий в том же классе, что и модель IAsyncResult, используйте EditorBrowsableAttribute со значением Advanced, чтобы обозначить реализацию модели IAsyncResult как дополнительную функцию.If you must expose both the event-based pattern and IAsyncResult pattern on a single class, use EditorBrowsableAttribute set to Advanced to mark the IAsyncResult pattern implementation as an advanced feature. В этом случае среды разработки, например Visual Studio IntelliSense, не будут отображать свойства и методы IAsyncResult.This indicates to design environments, such as Visual Studio IntelliSense, not to display the IAsyncResult properties and methods. Эти свойства и методы будут функционировать как прежде, но не будут захламлять рабочее пространство API-интерфейса для разработчика, работающего в IntelliSense.These properties and methods are still fully usable, but the developer working through IntelliSense has a clearer view of the API.

Критерии для предоставления модели IAsyncResult в дополнение к модели на основе событийCriteria for Exposing the IAsyncResult Pattern in Addition to the Event-based Pattern

В описанных выше сценариях асинхронная модель на основе событий дает целый ряд преимуществ, но имеет и некоторые недостатки. Их важно учитывать, если у вас высокие требования к производительности.While the Event-based Asynchronous Pattern has many benefits under the previously mentioned scenarios, it does have some drawbacks, which you should be aware of if performance is your most important requirement.

Есть три сценария, для которых модель на основе событий подходит хуже, чем модель IAsyncResult:There are three scenarios that the event-based pattern does not address as well as the IAsyncResult pattern:

Все эти сценарии можно реализовать с помощью модели на основе событий, но такое решение будет более громоздким, чем использование модели IAsyncResult.You can address these scenarios by using the event-based pattern, but doing so is more cumbersome than using the IAsyncResult pattern.

Разработчики часто используют модель IAsyncResult для служб с высокими требованиями к производительности.Developers often use the IAsyncResult pattern for services that typically have very high performance requirements. Например, сценарий с опросом завершения является одним из методов повышения производительности сервера.For example, the polling for completion scenario is a high-performance server technique.

Эффективность модели на основе событий ниже, чем у модели IAsyncResult, поскольку она создает несколько объектов (особенно EventArgs) и синхронизируется между потоками.Additionally, the event-based pattern is less efficient than the IAsyncResult pattern because it creates more objects, especially EventArgs, and because it synchronizes across threads.

Следующий список содержит рекомендации на случай, если вы решили использовать модель IAsyncResult.The following list shows some recommendations to follow if you decide to use the IAsyncResult pattern:

  • Предоставляйте модель IAsyncResult только в том случае, когда строго необходима поддержка объектов WaitHandle или IAsyncResult.Only expose the IAsyncResult pattern when you specifically require support for WaitHandle or IAsyncResult objects.

  • Предоставляйте модель IAsyncResult только в том случае, если у вас уже есть API, который использует модель IAsyncResult.Only expose the IAsyncResult pattern when you have an existing API that uses the IAsyncResult pattern.

  • Если у вас есть существующий API, основанный на модели IAsyncResult, постарайтесь в следующем выпуске реализовать и модель на основе событий.If you have an existing API based on the IAsyncResult pattern, consider also exposing the event-based pattern in your next release.

  • Предоставляйте модель IAsyncResult только в том случае, если у вас высокие требования к производительности, которые гарантированно недостижимы при применении модели на основе событий, но могут быть достижимы с помощью модели IAsyncResult.Only expose IAsyncResult pattern if you have high performance requirements which you have verified cannot be met by the event-based pattern but can be met by the IAsyncResult pattern.

См. такжеSee also