APM(비동기 프로그래밍 모델)Asynchronous Programming Model (APM)

IAsyncResult 디자인 패턴을 사용하는 비동기 작업은 각각 비동기 작업 OperationName을 시작하고 종료하는 BeginOperationNameEndOperationName이라는 두 개의 메서드로 구현됩니다.An asynchronous operation that uses the IAsyncResult design pattern is implemented as two methods named BeginOperationName and EndOperationName that begin and end the asynchronous operation OperationName respectively. 예를 들어 FileStream 클래스는 파일에서 바이트를 비동기적으로 읽는 BeginReadEndRead 메서드를 제공합니다.For example, the FileStream class provides the BeginRead and EndRead methods to asynchronously read bytes from a file. 이러한 메서드는 비동기 버전의 Read 메서드를 구현합니다.These methods implement the asynchronous version of the Read method.

참고

.NET Framework 4부터는 작업 병렬 라이브러리에서 비동기 및 병렬 프로그래밍을 위한 새로운 모델을 제공합니다.Starting with the .NET Framework 4, the Task Parallel Library provides a new model for asynchronous and parallel programming. 자세한 내용은 Task Parallel Library (TPL)Task-based Asynchronous Pattern (TAP)을 참조하세요.For more information, see Task Parallel Library (TPL) and Task-based Asynchronous Pattern (TAP)).

BeginOperationName을 호출한 후에는 비동기 작업이 다른 스레드에서 발생되는 동안 애플리케이션에서 호출 스레드에 대한 명령을 계속 실행할 수 있습니다.After calling BeginOperationName, an application can continue executing instructions on the calling thread while the asynchronous operation takes place on a different thread. BeginOperationName에 대한 각 호출에 대해 애플리케이션도 EndOperationName을 호출하여 작업 결과를 가져와야 합니다.For each call to BeginOperationName, the application should also call EndOperationName to get the results of the operation.

비동기 작업 시작Beginning an Asynchronous Operation

BeginOperationName 메서드는 비동기 작업 OperationName을 시작하고 IAsyncResult 인터페이스를 구현하는 개체를 반환합니다.The BeginOperationName method begins asynchronous operation OperationName and returns an object that implements the IAsyncResult interface. IAsyncResult 개체는 비동기 작업에 대한 정보를 저장합니다.IAsyncResult objects store information about an asynchronous operation. 다음 표에서는 비동기 작업에 대한 정보를 보여 줍니다.The following table shows information about an asynchronous operation.

멤버Member 설명Description
AsyncState 비동기 작업에 대한 정보를 포함하는 애플리케이션별 선택적 개체입니다.An optional application-specific object that contains information about the asynchronous operation.
AsyncWaitHandle 비동기 작업이 완료될 때까지 애플리케이션 실행을 차단하기 위해 사용할 수 있는 WaitHandle 입니다.A WaitHandle that can be used to block application execution until the asynchronous operation completes.
CompletedSynchronously 비동기 작업이 별도의 ThreadPool 스레드에서 완료되는 대신 BeginOperationName을 호출하는 데 사용된 스레드에서 완료되었는지 여부를 나타내는 값입니다.A value that indicates whether the asynchronous operation completed on the thread used to call BeginOperationName instead of completing on a separate ThreadPool thread.
IsCompleted 비동기 작업이 완료되었는지 여부를 나타내는 값입니다.A value that indicates whether the asynchronous operation has completed.

BeginOperationName 메서드에는 값 또는 참조로 전달되는 동기 버전의 메서드 시그니처에 선언된 매개 변수가 사용됩니다.A BeginOperationName method takes any parameters declared in the signature of the synchronous version of the method that are passed by value or by reference. out 매개 변수는 BeginOperationName 메서드 시그니처의 일부가 아닙니다.Any out parameters are not part of the BeginOperationName method signature. BeginOperationName 메서드 시그니처에는 두 개의 추가 매개 변수도 포함되어 있습니다.The BeginOperationName method signature also includes two additional parameters. 그중 첫 번째 매개 변수는 비동기 작업이 완료될 때 호출되는 메서드를 참조하는 AsyncCallback 대리자를 정의합니다.The first of these defines an AsyncCallback delegate that references a method that is called when the asynchronous operation completes. 호출자는 작업이 완료될 때 호출되는 메서드를 원하지 않는 경우 null (Visual Basic에서는Nothing )을 지정할 수 있습니다.The caller can specify null (Nothing in Visual Basic) if it does not want a method invoked when the operation completes. 두 번째 추가 매개 변수는 사용자 정의 개체입니다.The second additional parameter is a user-defined object. 이 개체를 사용하여 비동기 작업이 완료될 때 호출되는 메서드로 애플리케이션별 상태 정보를 전달할 수 있습니다.This object can be used to pass application-specific state information to the method invoked when the asynchronous operation completes. 파일에서 읽은 바이트를 저장하는 바이트 배열과 같이 BeginOperationName 메서드에서 작업 관련 추가 매개 변수를 사용하는 경우 AsyncCallback 및 애플리케이션 상태 개체는 BeginOperationName 메서드 시그니처의 마지막 매개 변수가 됩니다.If a BeginOperationName method takes additional operation-specific parameters, such as a byte array to store bytes read from a file, the AsyncCallback and application state object are the last parameters in the BeginOperationName method signature.

BeginOperationName은 호출 스레드에 대한 컨트롤을 즉시 반환합니다.BeginOperationName returns control to the calling thread immediately. BeginOperationName 메서드가 예외를 throw하면 이 예외는 이 비동기 작업이 시작되기 전에 throw됩니다.If the BeginOperationName method throws exceptions, the exceptions are thrown before the asynchronous operation is started. BeginOperationName 메서드가 예외를 throw하면 콜백 메서드는 호출되지 않습니다.If the BeginOperationName method throws exceptions, the callback method is not invoked.

비동기 작업 끝내기Ending an Asynchronous Operation

EndOperationName 메서드는 비동기 작업 OperationName을 종료합니다.The EndOperationName method ends asynchronous operation OperationName. EndOperationName 메서드의 반환 값은 이에 상응하는 동기 항목의 반환 값과 같은 유형으로서 비동기 작업에 대해서만 사용됩니다.The return value of the EndOperationName method is the same type returned by its synchronous counterpart and is specific to the asynchronous operation. 예를 들어 EndRead 메서드는 FileStream 에서 읽은 바이트 수를 반환하고 EndGetHostByName 메서드는 호스트 컴퓨터에 대한 정보를 포함하는 IPHostEntry 개체를 반환합니다.For example, the EndRead method returns the number of bytes read from a FileStream and the EndGetHostByName method returns an IPHostEntry object that contains information about a host computer. EndOperationName 메서드는 동기 버전의 메서드 시그니처에 선언된 out 또는 ref 매개 변수를 사용합니다.The EndOperationName method takes any out or ref parameters declared in the signature of the synchronous version of the method. EndOperationName 메서드에는 동기 메서드의 매개 변수와 함께 IAsyncResult 매개 변수도 포함되어 있습니다.In addition to the parameters from the synchronous method, the EndOperationName method also includes an IAsyncResult parameter. 호출자는 BeginOperationName에 대한 해당 호출로 반환된 인스턴스를 전달해야 합니다.Callers must pass the instance returned by the corresponding call to BeginOperationName.

EndOperationName이 호출되었을 때 IAsyncResult 개체에 표시되는 비동기 작업이 완료되지 않은 경우에는 EndOperationName에서 비동기 작업이 완료될 때까지 해당 호출 스레드를 차단합니다.If the asynchronous operation represented by the IAsyncResult object has not completed when EndOperationName is called, EndOperationName blocks the calling thread until the asynchronous operation is complete. 비동기 작업이 throw한 예외는 EndOperationName 메서드에서 throw됩니다.Exceptions thrown by the asynchronous operation are thrown from the EndOperationName method. 같은 IAsyncResultEndOperationName 메서드를 여러 번 호출한 데 따른 효과는 정의되어 있지 않습니다.The effect of calling the EndOperationName method multiple times with the same IAsyncResult is not defined. 마찬가지로 관련된 Begin 메서드에서 반환하지 않은 IAsyncResultEndOperationName 메서드를 호출하는 경우도 정의되어 있지 않습니다.Likewise, calling the EndOperationName method with an IAsyncResult that was not returned by the related Begin method is also not defined.

참고

정의되지 않은 두 시나리오 중 하나의 경우 구현자는 InvalidOperationException을 throw하는 것을 고려해야 합니다.For either of the undefined scenarios, implementers should consider throwing InvalidOperationException.

참고

이 디자인 패턴의 구현자는 IsCompleted 를 true로 설정하여 비동기 콜백 메서드(지정된 경우)를 호출하고 AsyncWaitHandle을 신호로 보내서 비동기 작업이 완료되었다는 것을 호출자에게 알려야 합니다.Implementers of this design pattern should notify the caller that the asynchronous operation completed by setting IsCompleted to true, calling the asynchronous callback method (if one was specified) and signaling the AsyncWaitHandle.

애플리케이션 개발자는 비동기 작업의 결과에 액세스하기 위해 여러 디자인을 선택할 수 있습니다.Application developers have several design choices for accessing the results of the asynchronous operation. 어떤 선택이 올바른 선택인지는 애플리케이션에 작업이 완료되는 동안 실행할 수 있는 지침이 있는지 여부에 따라 달라집니다.The correct choice depends on whether the application has instructions that can execute while the operation completes. 비동기 작업의 결과를 받을 때까지 애플리케이션이 추가 작업을 수행할 수 없는 경우 결과를 사용할 수 있을 때까지 애플리케이션을 차단해야 합니다.If an application cannot perform any additional work until it receives the results of the asynchronous operation, the application must block until the results are available. 비동기 작업이 완료될 때까지 차단하려면 다음 방법 중 하나를 사용하면 됩니다.To block until an asynchronous operation completes, you can use one of the following approaches:

비동기 작업이 완료되는 동안 차단할 필요가 없는 애플리케이션은 다음 방법 중 하나를 사용할 수 있습니다.Applications that do not need to block while the asynchronous operation completes can use one of the following approaches:

참고 항목See also