다음을 통해 공유


이벤트 기반 비동기 패턴 구현 시기 결정

업데이트: 2007년 11월

이벤트 기반 비동기 패턴은 클래스의 비동기 동작을 노출하기 위한 패턴을 제공합니다. 이 패턴의 도입과 함께 .NET Framework에서는 비동기 동작을 노출하기 위한 두 가지 패턴인 System.IAsyncResult 인터페이스 기반의 비동기 패턴과 이벤트 기반 패턴을 정의합니다. 이 항목에서는 이 두 패턴을 구현하는 적절한 시점에 대해 설명합니다.

IAsyncResult 인터페이스를 사용한 비동기 프로그래밍에 대한 자세한 내용은 비동기 프로그래밍 디자인 패턴을 참조하십시오.

일반 원칙

일반적으로 가능하면 이벤트 기반 비동기 패턴을 사용하여 비동기 기능을 노출해야 합니다. 그러나 이벤트 기반 패턴이 충족시킬 수 없는 몇 가지 요구 사항이 있습니다. 이러한 경우 이벤트 기반 패턴과 함께 IAsyncResult 패턴을 구현해야 합니다.

참고:

이벤트 기반 패턴을 구현하지 않고 IAsyncResult 패턴을 구현하는 경우는 거의 없습니다.

지침

다음 목록에서는 이벤트 기반 비동기 패턴을 구현해야 하는 시점에 대한 지침을 설명합니다.

  • 클래스의 비동기 동작을 노출하려면 이벤트 기반 패턴을 기본 API로 사용합니다.

  • Windows Forms과 같은 클라이언트 응용 프로그램에서 클래스가 주로 사용되는 경우 IAsyncResult 패턴을 노출해서는 안 됩니다.

  • 요구 사항을 충족시키는 데 필요한 경우에만 IAsyncResult 패턴을 노출합니다. 예를 들어, 기존 API와의 호환을 위해 IAsyncResult 패턴을 노출해야 할 수 있습니다.

  • 이벤트 기반 패턴을 함께 노출하는 경우에만 IAsyncResult 패턴을 노출합니다.

  • IAsyncResult 패턴을 노출해야 하는 경우 고급 옵션으로 노출합니다. 예를 들어, 프록시 개체를 생성하는 경우 IAsyncResult 패턴을 생성하는 옵션을 사용하여 이벤트 기반 패턴을 기본적으로 생성합니다.

  • IAsyncResult 패턴 구현에서 이벤트 기반 패턴 구현을 빌드합니다.

  • 이벤트 기반 패턴과 IAsyncResult 패턴을 동일한 클래스에 함께 노출하지 않습니다. 이벤트 기반 패턴을 "더 높은 수준" 클래스에 노출하고 IAsyncResult 패턴을 “더 낮은 수준” 클래스에 노출합니다. 예를 들어, WebClient 구성 요소의 이벤트 기반 패턴과 HttpRequest 클래스의 IAsyncResult 패턴을 비교합니다.

    • 호환을 위해 필요한 경우 이벤트 기반 패턴과 IAsyncResult 패턴을 동일한 클래스에 노출합니다. 예를 들어, IAsyncResult 패턴을 사용하는 API를 이미 해제한 경우 이전 버전과의 호환성을 위해 IAsyncResult 패턴을 유지해야 합니다.

    • 구현을 구분하여 얻은 이점보다 결과로 만들어진 개체 모델의 복잡성으로 인한 부담이 큰 경우 이벤트 기반 패턴과 IAsyncResult 패턴을 동일한 클래스에 노출합니다. 이벤트 기반 패턴을 노출하지 않는 것보다 단일 클래스에 두 패턴을 함께 노출하는 것이 더 좋습니다.

    • 이벤트 기반 패턴과 IAsyncResult 패턴을 단일 클래스에 함께 노출해야 하는 경우 Advanced로 설정된 EditorBrowsableAttribute를 사용하여 IAsyncResult 패턴 구현을 고급 기능으로 표시합니다. 이는 IAsyncResult 속성과 메서드를 표시하는 것이 아니라 Visual Studio IntelliSense와 같은 환경을 설계하는 것을 의미합니다. 이러한 속성과 메서드는 아직도 충분히 사용할 수 있지만 IntelliSense에서 작업하는 개발자는 API를 보다 잘 볼 수 있습니다.

이벤트 기반 패턴과 함께 IAsyncResult 패턴을 노출하기 위한 기준

이벤트 기반 비동기 패턴에는 앞서 언급한 시나리오에서 많은 장점이 있지만 성능이 가장 중요한 요구 사항인 경우 사용자가 알아야 하는 몇 가지 단점도 있습니다.

다음은 이벤트 기반 패턴이 IAsyncResult 패턴과 마찬가지로 잘 처리할 수 없는 세 가지 시나리오입니다.

이벤트 기반 패턴을 사용하여 이러한 시나리오를 처리할 수는 있지만 이렇게 하는 것은 IAsyncResult 패턴을 사용하는 것보다 어렵습니다.

개발자는 일반적으로 성능에 대한 요구 사항이 매우 높은 서비스에 IAsyncResult 패턴을 사용합니다. 예를 들어, 완료에 대한 폴링 시나리오는 고성능 서버 기술입니다.

또한 이벤트 기반 패턴은 보다 많은 개체, 특히 보다 많은 EventArgs 개체를 만들고 스레드를 동기화하므로 IAsyncResult 패턴보다 효율성이 낮습니다.

다음 목록에서는 IAsyncResult 패턴을 사용하려는 경우 준수해야 하는 몇 가지 권장 사항을 보여 줍니다.

  • IAsyncResult 패턴은 WaitHandle 또는 IAsyncResult 개체에 대한 지원이 특별히 필요한 경우에만 노출합니다.

  • IAsyncResult 패턴은 IAsyncResult 패턴을 사용하는 기존 API가 있는 경우에만 노출합니다.

  • IAsyncResult 패턴을 기반으로 하는 기존 API가 있는 경우 다음 릴리스에 이벤트 기반 패턴을 노출하는 것도 고려합니다.

  • IAsyncResult 패턴은 높은 성능 요구 사항을 이벤트 기반 패턴으로는 충족시킬 수 없지만 IAsyncResult 패턴으로는 충족시킬 수 있는 경우에만 노출합니다.

참고 항목

작업

연습: 이벤트 기반 비동기 패턴을 지원하는 구성 요소 구현

개념

이벤트 기반 비동기 패턴 구현

최선의 이벤트 기반 비동기 패턴 구현 방법

이벤트 기반 비동기 패턴 개요

기타 리소스

비동기 프로그래밍 디자인 패턴

이벤트 기반 비동기 패턴을 사용한 다중 스레드 프로그래밍