비동기 모델

Windows Web Services API의 대부분의 작업은 동기적으로 또는 비동기적으로 수행할 수 있습니다. 함수를 동기적으로 호출하려면 WS_ASYNC_CONTEXT 구조체에 대해 null 값을 전달합니다. 함수를 비동기적으로 수행할 수 있도록 지정하려면 null이 아닌 WS_ASYNC_CONTEXT 함수에 전달합니다.

비동기적으로 호출되면 함수는 동기적으로 또는 비동기적으로 완료할 수 있습니다. 함수가 동기적으로 완료되면 최종 성공 또는 오류를 나타내는 값이 반환되고 이 값은 항상 WS_S_ASYNC 이외의 값입니다( Windows Web Services 반환 값 참조). 그러나 WS_S_ASYNC 반환 값은 함수가 비동기적으로 완료됨을 나타냅니다. 함수가 비동기적으로 완료되면 콜백이 호출되어 작업 완료를 알릴 수 있습니다. 이 콜백은 최종 성공 또는 오류 값을 나타냅니다. 작업이 동기적으로 완료되면 콜백이 호출되지 않습니다.

비동기 컨텍스트를 만들려면 WS_ASYNC_CONTEXT 구조체의 콜백콜백State 필드를 초기화합니다. callbackState 필드는 WS_ASYNC_CALLBACK 함수에 전달되는 사용자 정의 데이터에 대한 포인터를 지정하는 데 사용됩니다.

다음 예제에서는 콜백 및 상태 데이터에 대한 포인터를 포함하는 WS_ASYNC_CONTEXT 구조체에 포인터를 전달하여 함수를 비동기적으로 호출하는 방법을 보여 줍니다.

HRESULT ExampleAsyncFunction(WS_ASYNC_CONTEXT* asyncContext);
void ExampleAsyncFunction()
{
    // Set up the WS_ASYNC_CONTEXT structure.
    MyState* myState = ...;  \\ Declare a pointer to user-defined data.
    WS_ASYNC_CONTEXT asyncContext;
    asyncContext.callback = MyCallback;  \\ Set the callback.
    asyncContext.callbackState = myState; \\ Set the pointer to the user-defined data.

    // Start the asynchronous operation
    HRESULT hr = SomeFunction(&asyncContext);

    if (hr == WS_S_ASYNC)
    {
        // The operation is completing asynchronously.  The callback is called 
        // when the operation is complete.
    }
    else
    {
        // The operation completed synchronously.  The callback is not called.
    }
}
void CALLBACK MyCallback(HRESULT hr, WS_CALLBACK_MODEL callbackModel, void* callbackState)
{
    MyState* myState = (MyState*)callbackState;

    // The operation completed asynchronously.
}

WS_ASYNC_CONTEXT 구조체는 비동기 작업 기간이 아닌 함수 호출 기간 동안만 비동기 함수에서 사용되므로 스택에서 안전하게 선언할 수 있습니다.

WS_ASYNC_CONTEXT 구조 외에 다른 매개 변수가 포인터로 비동기 함수에 전달되고 함수가 비동기적으로 완료되는 경우 비동기 콜백이 호출될 때까지 이러한 매개 변수가 가리키는 값을 활성 상태로 유지해야 합니다(해제되지 않음).

콜백이 수행할 수 있는 작업에는 제한이 있습니다. 가능한 작업에 대한 자세한 내용은 WS_CALLBACK_MODEL 참조하세요.

비동기 함수를 구현하는 경우 비동기 함수가 호출자에게 반환되기 전에 비동기 함수를 호출한 동일한 스레드에서 콜백을 호출하지 마세요. 이 경우 비동기 모델이 중단되기 때문이다.

일련의 비동기 작업을 실행해야 하는 함수를 구현하는 경우 WsAsyncExecute 도우미 함수를 사용하는 것이 좋습니다.

비동기 함수 예제에서는 비동기 모델을 따르는 함수를 구현하고 사용하는 방법을 보여 줍니다.

비동기 IO 작업을 시작하면 시스템 리소스가 소비됩니다. 충분한 IO 작업이 시작되면 시스템이 응답하지 않게 될 수 있습니다. 이를 방지하려면 애플리케이션이 시작하는 비동기 작업의 수를 제한해야 합니다.

비동기 모델은 다음 API 요소를 사용합니다.

콜백 설명
WS_ASYNC_CALLBACK 비동기 모델과 함께 사용되는 콜백 함수 매개 변수입니다.
WS_ASYNC_FUNCTION WsAsyncExecute와 함께 일련의 비동기 작업에서 호출할 다음 함수를 지정하는 데 사용됩니다.

 

열거형 설명
WS_CALLBACK_MODEL 콜백의 스레딩 동작(예: WS_ASYNC_CALLBACK)을 지정합니다.

 

함수 Description
WsAsyncExecute 비동기 작업을 시작할 수 있는 사용자 정의 콜백을 호출하고 비동기 작업이 완료될 때 호출해야 하는 함수를 나타냅니다.

 

구조체 설명
WS_ASYNC_CONTEXT 비동기 콜백에 전달될 사용자 정의 데이터에 대한 포인터 및 비동기 콜백을 지정합니다.
WS_ASYNC_OPERATION WsAsyncExecute와 함께 일련의 비동기 작업에서 호출할 다음 함수를 지정하는 데 사용됩니다.
WS_ASYNC_STATE WsAsyncExecute에서 비동기 작업의 상태를 관리하는 데 사용됩니다.

 

비동기 함수 예제

WS_ASYNC_CALLBACK

WS_ASYNC_CONTEXT

WS_CALLBACK_MODEL

WsAsyncExecute