다음을 통해 공유


비동기 회신 보내기

비동기 호출이 완료되면 서버는 RpcAsyncCompleteCall 함수를 호출하고 비동기 핸들을 전달하여 클라이언트에 회신을 보냅니다. 비동기 호출에 void 반환 값이 있고 [out] 매개 변수가 없는 경우에도 이 호출이 필요합니다. 함수에 반환 값이 있는 경우 RpcAsyncCompleteCall에 대한 참조로 전달됩니다.

서버가 RpcAsyncCompleteCall 또는 RpcAsyncAbortCall을 호출하거나 서버 관리자 루틴에서 예외가 발생했기 때문에 호출이 완료되면 RPC 런타임 라이브러리는 서버의 비동기 핸들을 자동으로 삭제합니다.

참고

서버는 RpcAsyncCompleteCall을 호출하기 전에 [in, out] 및 [out] 매개 변수 업데이트를 완료해야 합니다. RpcAsyncCompleteCall을 호출한 후 해당 매개 변수 또는 비동기 핸들을 변경할 수 없습니다. RpcAsyncCompleteCall 함수 호출이 실패하면 RPC 런타임에서 매개 변수를 해제합니다.

 

다음 예제에서는 간단한 비동기 프로시저 호출을 보여 줍니다.

#define DEFAULT_ASYNC_DELAY 20;
#define ASYNC_CANCEL_CHECK 100;

void AsyncFunc(IN PRPC_ASYNC_STATE pAsync,
               IN RPC_BINDING_HANDLE hBinding,
               IN OUT unsigned long nAsychDelay)
{
    int nReply = 1;
    RPC_STATUS status;
    unsigned long nTmpAsychDelay;
    int i;
 
    if (nAsychDelay < 0){
        nAsychDelay = DEFAULT_ASYNC_DELAY;
    }else if (nAsychDelay < 100){
        nAsychDelay = 100;
    }

    // We only call RpcServerTestCancel if the call
    // takes longer than ASYNC_CANCEL_CHECK ms
    if(nAsychDelay > ASYNC_CANCEL_CHECK){
        
        nTmpAsychDelay = nAsychDelay/100;
 
        for (i = 0; i < 100; i++){
            Sleep(nTmpAsychDelay);
 
            if (i%5 == 0){
                fprintf(stderr, 
                        "\rRunning AsyncFunc (%lu ms) (%d%c) ... ",
                        nAsychDelay, i+5, PERCENT);
 
                status = 
                    RpcServerTestCancel(
                        RpcAsyncGetCallHandle(pAsync));
                if (status == RPC_S_OK){
                    fprintf(stderr, 
                            "\nAsyncFunc has been canceled!!!\n");
                    break;
                }else if (status != RPC_S_CALL_IN_PROGRESS){
                    printf(
                        "RpcAsyncInitializeHandle returned 0x%x\n", 
                        status);
                    exit(status); 
                }
            }
        }
    }else{
        Sleep(nAsychDelay);
    }
 
    printf("\nCalling RpcAsyncCompleteCall\n");
    status = RpcAsyncCompleteCall(pAsync, &nReply);
    printf("RpcAsyncCompleteCall returned 0x%x\n", status);
    if (status){
        exit(status);
    }
}

간단히 하기 위해 이 비동기 서버 루틴은 실제 데이터를 처리하지 않습니다. 그것은 단순히 잠시 동안 잠을 자신을 두고.

참고

RpcAsyncCompleteCall 함수는 호출을 받은 스레드 또는 프로세스의 다른 스레드에서 호출할 수 있습니다. 호출을 완료하는 데 필요한 모든 데이터를 쉽게 사용할 수 있는 경우 서버는 동일한 스레드에서 해당 데이터를 채우고 동일한 스레드에서 RpcAsyncCompleteCall 을 호출할 수 있습니다. 이 방법은 일부 컨텍스트 전환을 저장하고 성능을 향상시킵니다. 이러한 호출은 기회적으로 비동기적으로 호출됩니다.

 

RPC_ASYNC_STATE

RpcAsyncCompleteCall

RpcAsyncAbortCall

RpcServerTestCancel