이벤트 기반 비동기 패턴은 클래스의 비동기 동작을 노출하는 패턴을 제공합니다. 이 패턴이 도입되면서 .NET은 비동기 동작을 노출하기 위한 두 가지 패턴, 즉 인터페이스를 기반으로 System.IAsyncResult 하는 비동기 패턴과 이벤트 기반 패턴을 정의합니다. 이 문서에서는 두 패턴을 모두 구현하는 것이 적절한 시기를 설명합니다.
인터페이스를 사용한 비동기 프로그래밍 IAsyncResult 에 대한 자세한 내용은 APM(비동기 프로그래밍 모델)을 참조하세요.
일반 원칙
일반적으로 가능하면 이벤트 기반 비동기 패턴을 사용하여 비동기 기능을 노출해야 합니다. 그러나 이벤트 기반 패턴이 충족할 수 없는 몇 가지 요구 사항이 있습니다. 이러한 경우 이벤트 기반 패턴 외에도 IAsyncResult 패턴을 구현해야 할 수 있습니다.
비고
IAsyncResult 패턴이 구현될 때 이벤트 기반 패턴도 함께 구현되지 않는 경우는 드뭅니다.
지침
다음 목록에서는 이벤트 기반 비동기 패턴을 구현해야 하는 시기에 대한 지침을 설명합니다.
이벤트 기반 패턴을 기본 API로 사용하여 클래스에 대한 비동기 동작을 노출합니다.
클래스가 IAsyncResult 클라이언트 애플리케이션(예: Windows Forms)에서 주로 사용되는 경우 패턴을 노출하지 마세요.
요구 사항을 충족하는 데 필요한 경우에만 패턴을 노출 IAsyncResult 합니다. 예를 들어 기존 API와의 호환성을 위해 패턴을 노출 IAsyncResult 해야 할 수 있습니다.
이벤트 기반 패턴도 함께 노출하지 않으면 IAsyncResult 패턴을 노출하지 마세요.
패턴을 반드시 노출해야 하는 경우에는 이를 고급 옵션으로 표시하십시오. 예를 들어 프록시 개체를 생성하는 경우 기본적으로 패턴을 생성하는 옵션을 사용하여 이벤트 기반 패턴을 생성 IAsyncResult 합니다.
기존의 IAsyncResult 패턴 구현 위에 이벤트 기반 패턴 구현을 만드세요.
동일한 클래스에서 이벤트 기반 패턴과 IAsyncResult 패턴을 모두 노출하지 않습니다. "상위 수준" 클래스에 이벤트 기반 패턴과 "하위 수준" 클래스의 IAsyncResult 패턴을 노출합니다. 예를 들어 구성 요소의 이벤트 기반 패턴을 WebClient 클래스의 IAsyncResult 패턴과 비교합니다 HttpRequest .
호환성이 필요한 경우 이벤트 기반 패턴과 IAsyncResult 패턴을 동일한 클래스에 노출합니다. 예를 들어, IAsyncResult 패턴을 사용하는 API를 이미 릴리스한 경우, 이전 버전과의 호환성을 위해 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으로 충족될 수 있는 것을 먼저 확인하십시오.
참고하십시오
.NET