Asenkron Çağrı Yapma
Asenkron bir uzak çağrı yapabilmesi için, istemcinin asenkron tanıtıcıyı başlatması gerekir. İstemci ve sunucu programları, zaman uyumsuz tanıtıcılar için RPC_ASYNC_STATE yapısına yönelik işaretçiler kullanır.
Bekleyen her çağrının kendi benzersiz zaman uyumsuz tanıtıcısı olmalıdır. İstemci tanıtıcıyı oluşturur ve RpcAsyncInitializeHandle işlevine iletir. İstemcinin, sunucunun asenkron yanıtını alana kadar tanıtıcı için ayrılan belleğin salıverilmediğinden emin olması gerekir ki çağrı doğru şekilde tamamlanabilsin. Ayrıca, mevcut bir zaman uyumsuz tanıtıcı üzerinde başka bir çağrı yapmadan önce istemcinin tanıtıcıyı yeniden başlatması gerekir. Bunun yapılmaması, istemci saplamanın çağrı sırasında bir özel durum oluşturmasına neden olabilir. İstemci ayrıca [out] parametreleri ve [in, out] parametreleri için sağladığı arabelleklerin, sunucudan yanıt alana kadar ayrılmaya devam ettiğinden emin olmalıdır. Bu arabellekler, zaman uyumsuz bir uzak prosedüre atanan parametrelerdir.
Zaman uyumsuz bir uzak yordamı çağırdığında, istemcinin RPC çalışma zamanı kitaplığının çağrının tamamlandığını bildirmek için kullanacağı yöntemi seçmesi gerekir. İstemci bu bildirimi aşağıdaki yollardan herhangi biriyle alabilir:
Olay. İstemci, çağrı tamamlandığında tetiklenecek bir olay tanımlayabilir. Ayrıntılar için bkz. Olay Nesneleri.
Yoklama. İstemci, RpcAsyncGetCallStatustekrar tekrar çağırabilir. Dönüş değeri RPC_S_ASYNC_CALL_PENDING dışında bir değerse çağrı tamamlanır. Bu yöntem, burada açıklanan diğer yöntemlerden daha fazla CPU süresi kullanır.
APC. İstemci, çağrı tamamlandığında çağrılan zaman uyumsuz yordam çağrısı (APC) belirtebilir. APC işlevinin prototipi için bkz. RPCNOTIFICATION_ROUTINE. APC, Olay parametresi RpcCallComplete olarak ayarlanmış olarak çağrılır. APC'lerin gönderilebilmesi için istemci iş parçacığının uyarılabilir bir bekleme konumunda olması gerekir.
Asenkron tutamaçtaki hThread alanı 0 olarak ayarlanmışsa, APC'ler zaman uyumsuz çağrıyı yapan iş parçacığında kuyruğa alınır. Sıfır değilse, APC'ler m tarafından belirtilen iş parçacığında kuyruğa alınır.
IOC. G/Ç tamamlama bağlantı noktası, zaman uyumsuz tanıtıcıda belirtilen parametrelerle bildirilir. Daha fazla bilgi için bkz. CreateIoCompletionPort.
Windows tutamacı. Belirtilen pencere tutamacına (HWND) bir ileti gönderiliyor.
Aşağıdaki kod parçası, zaman uyumsuz bir tanıtıcıyı başlatmak ve onu kullanarak zaman uyumsuz bir uzak yordam çağrısını yapmak için gereken temel adımları gösterir.
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
Bu örnekte gösterildiği gibi, zaman uyumsuz bir yordam çağrısı hala bekleme aşamasındayken, istemci programınız zaman uyumlu uzak yordam çağrılarını yürütebilir. Bu istemci, zaman uyumsuz çağrı tamamlandığında onu bilgilendirmek için RPC çalışma zamanı kitaplığı tarafından kullanılacak bir olay nesnesi oluşturur.
Dikkat
Zaman uyumsuz bir çağrı sırasında bir RPC özel durumu tetiklenirse, zaman uyumsuz RPC işlevinden tamamlanma bildirimi geri gönderilmeyecektir.