다음을 통해 공유


비동기 프로그래밍 개요

IAsyncResult 디자인 패턴을 사용하는 비동기 작업은 BeginOperationName과 EndOperationName이라는 두 가지 메서드로 구현됩니다. 이 두 메서드를 사용하면 각각 비동기 작업 OperationName이 시작되고 종료됩니다. 예를 들어, FileStream 클래스는 파일에서 비동기 방식으로 바이트를 읽도록 BeginReadEndRead 메서드를 제공합니다. 이 두 메서드는 Read 메서드의 비동기 버전을 구현합니다.

BeginOperationName을 호출한 후에는 비동기 작업이 다른 스레드에서 발생되는 동안 응용 프로그램에서 호출 스레드에 대한 명령을 계속 실행할 수 있습니다. BeginOperationName을 호출할 경우 각각의 경우에 대해서 작업 결과를 확인하려면 응용 프로그램에서 EndOperationName을 호출해야 합니다.

비동기 작업 시작

BeginOperationName 메서드를 사용하면 비동기 작업 OperationName이 시작되고 IAsyncResult 인터페이스를 구현하는 개체가 반환됩니다. IAsyncResult 개체에는 비동기 작업에 대한 정보가 저장됩니다. 다음 표에서는 비동기 작업에 대한 정보를 보여 줍니다.

멤버

설명

AsyncState

비동기 작업에 대한 정보를 포함하는 선택적 응용 프로그램 관련 개체입니다.

AsyncWaitHandle

비동기 작업이 완료될 때까지 응용 프로그램 실행을 블로킹하는 데 사용할 수 있는 WaitHandle입니다.

CompletedSynchronously

비동기 작업이 별도의 ThreadPool 스레드에서 완료되는 대신 BeginOperationName 호출에 사용된 스레드에서 완료되었는지 여부를 나타내는 값입니다.

IsCompleted

비동기 작업이 완료되었는지 여부를 나타내는 값입니다.

BeginOperationName 메서드에는 값 또는 참조로 전달되는 동기 버전의 메서드 시그니처에 선언된 매개 변수가 사용됩니다. out 매개 변수는 BeginOperationName 메서드 시그니처의 일부가 아닙니다. BeginOperationName 메서드 시그니처에는 두 개의 추가 매개 변수도 포함되어 있습니다. 이 중 첫 번째 매개 변수는 비동기 작업이 완료될 때 호출되는 메서드를 참조하도록 AsyncCallback 대리자를 정의합니다. 호출자는 해당 작업이 완료될 때 메서드가 호출되지 않게 하려면 null(Visual Basic에서는 Nothing)을 지정할 수 있습니다. 두 번째 추가 매개 변수는 사용자 정의 개체입니다. 이 개체는 비동기 작업이 완료될 때 호출된 메서드에 응용 프로그램 관련 상태 정보를 전달하는 데 사용할 수 있습니다. 파일에서 읽은 바이트를 저장하는 바이트 배열과 같이 BeginOperationName 메서드에서 작업 관련 추가 매개 변수를 사용하는 경우 AsyncCallback 및 응용 프로그램 상태 개체는 BeginOperationName 메서드 시그니처의 마지막 매개 변수가 됩니다.

BeginOperationName은 호출 스레드에 대한 컨트롤을 즉시 반환합니다. BeginOperationName 메서드가 예외를 throw하면 이 예외는 이 비동기 작업이 시작되기 전에 throw됩니다. BeginOperationName 메서드가 예외를 throw하면 콜백 메서드는 호출되지 않습니다.

비동기 작업 종료

EndOperationName 메서드는 비동기 작업 OperationName을 끝냅니다. EndOperationName 메서드의 반환 값은 이에 상응하는 동기 항목의 반환 값과 같은 유형으로서 비동기 작업에 대해서만 사용됩니다. 예를 들어, EndRead 메서드는 FileStream에서 읽은 바이트 수를 반환하고 EndGetHostByName 메서드는 호스트 컴퓨터에 대한 정보를 포함하는 IPHostEntry 개체를 반환합니다. EndOperationName 메서드는 동기 버전의 메서드 시그니처에 선언된 out 또는 ref 매개 변수를 사용합니다. EndOperationName 메서드에는 동기 메서드의 매개 변수와 함께 IAsyncResult 매개 변수도 포함되어 있습니다. 호출자는 BeginOperationName에 대한 해당 호출로 반환된 인스턴스를 전달해야 합니다.

EndOperationName이 호출되었을 때 IAsyncResult 개체에 표시되는 비동기 작업이 완료되지 않은 경우에는 EndOperationName에서 비동기 작업이 완료될 때까지 해당 호출 스레드를 블로킹합니다. 비동기 작업이 throw한 예외는 EndOperationName 메서드에서 throw됩니다. 같은 IAsyncResultEndOperationName 메서드를 여러 번 호출한 데 따른 효과는 정의되어 있지 않습니다. 마찬가지로 관련된 Begin 메서드에서 반환하지 않은 IAsyncResultEndOperationName 메서드를 호출하는 경우도 정의되어 있지 않습니다.

참고참고

정의되지 않은 시나리오의 경우 구현자는 InvalidOperationException throw를 고려해야 합니다.

참고참고

이 디자인 패턴의 구현자는 IsCompleted를 true로 설정하고 비동기 콜백 메서드가 지정되어 있는 경우 이 메서드를 호출하며 AsyncWaitHandle을 신호로 보내는 방법으로 비동기 작업이 완료되었음을 호출자에게 알려야 합니다.

응용 프로그램 개발자에게는 비동기 작업의 결과에 액세스하는 몇 가지 디자인 선택 사항이 있습니다. 올바른 선택은 응용 프로그램에 해당 작업이 완료되는 동안 실행할 수 있는 명령이 있는지 여부에 따라 달라집니다. 응용 프로그램에서 비동기 작업의 결과를 받을 때까지 추가 작업을 수행할 수 없는 경우에는 결과를 사용할 수 있게 될 때까지 해당 응용 프로그램을 블로킹해야 합니다. 비동기 작업이 완료될 때까지 블로킹하려면 다음 방법 중 하나를 사용합니다.

비동기 작업이 완료되는 동안 블로킹할 필요가 없는 응용 프로그램은 다음 방법 중 하나를 사용할 수 있습니다.

참고 항목

개념

동기 메서드를 비동기 방식으로 호출

AsyncCallback 대리자 및 상태 개체 사용

기타 리소스

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