進行非同步呼叫
用戶端必須先初始化非同步控制碼,才能進行非同步遠端呼叫。 用戶端和伺服器程式會針對非同步控制碼使用 RPC_ASYNC_STATE 結構的指標。
每個未處理的呼叫都必須有自己的唯一非同步控制碼。 用戶端會建立控制碼,並將其傳遞至 RpcAsyncInitializeHandle 函式 。 若要讓呼叫正確完成,用戶端必須確定在收到伺服器的非同步回復之前,不會釋放控制碼的記憶體。 此外,在對現有的非同步控制碼進行另一個呼叫之前,用戶端必須重新初始化控制碼。 無法這樣做可能會導致用戶端存根在呼叫期間引發例外狀況。 用戶端也必須確保提供給 [out] 參數和 [in, out] 參數的緩衝區仍會配置到非同步遠端程式,直到收到來自伺服器的回復為止。
當它叫用非同步遠端程式時,用戶端必須選取 RPC 執行時間程式庫將用來通知呼叫完成的方法。 用戶端可以透過下列任一方式接收此通知:
事件。 用戶端可以指定呼叫完成時要引發的事件。 如需詳細資訊,請參閱 事件物件。
輪詢。 用戶端可以重複呼叫 RpcAsyncGetCallStatus。 如果傳回值不是RPC_S_ASYNC_CALL_PENDING,呼叫就會完成。 這個方法會使用比此處所述的其他方法更多的 CPU 時間。
Apc。 用戶端可以指定 非同步程序呼叫 (APC) 呼叫完成時呼叫。 如需 APC 函式的原型,請參閱 RPCNOTIFICATION_ROUTINE。 系統會呼叫 APC,並將其 Event 參數設定為 RpcCallComplete。 若要讓 APC 分派,用戶端執行緒必須處於可警示的等候狀態。
如果非同步控制碼中的 hThread 欄位設定為 0,則 APC 會在進行非同步呼叫的執行緒上排入佇列。 如果是非零,則 APC 會排入 m 所指定的執行緒上。
國際 奧會。 I/O 完成埠會通知非同步控制碼中指定的參數。 如需詳細資訊,請參閱 CreateIoCompletionPort。
Windows 控制碼。 訊息會張貼至指定的視窗控制碼 (HWND) 。
下列程式碼片段顯示初始化非同步控制碼以及使用它進行非同步遠端程序呼叫所需的基本步驟。
RPC_ASYNC_STATE Async;
RPC_STATUS status;
// Initialize the handle.
status = RpcAsyncInitializeHandle(&Async, sizeof(RPC_ASYNC_STATE));
if (status)
{
// Code to handle the error goes here.
}
Async.UserInfo = NULL;
Async.NotificationType = RpcNotificationTypeEvent;
Async.u.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (Async.u.hEvent == 0)
{
// Code to handle the error goes here.
}
// Call an asynchronous RPC routine here
RpcTryExcept
{
printf("\nCalling the remote procedure 'AsyncFunc'\n");
AsyncFunc(&Async, AsyncRPC_ClientIfHandle, nAsychDelay);
}
RpcExcept(1)
{
ulCode = RpcExceptionCode();
printf("AsyncFunc: Run time reported exception 0x%lx = %ld\n",
ulCode, ulCode);
}
RpcEndExcept
// Call a synchronous routine while
// the asynchronous procedure is still running
RpcTryExcept
{
printf("\nCalling the remote procedure 'NonAsyncFunc'\n");
NonAsyncFunc(AsyncRPC_ClientIfHandle, pszMessage);
fprintf(stderr,
"While 'AsyncFunc' is running asynchronously,\n"
"we still can send message to the server in the mean "
"time.\n\n");
}
RpcExcept(1)
{
ulCode = RpcExceptionCode();
printf("NonAsyncFunc: Run time reported exception 0x%lx = %ld\n",
ulCode, ulCode);
}
RpcEndExcept
如本範例所示,您的用戶端程式可以在非同步程序呼叫仍在擱置時執行同步遠端程序呼叫。 此用戶端會建立 RPC 執行時間程式庫的事件物件,以在非同步呼叫完成時用來通知它。
注意
如果在非同步呼叫期間引發 RPC 例外狀況,則不會從非同步 RPC 常式傳回完成通知。