Megosztás a következőn keresztül:


Aszinkron hívás indítása

Mielőtt aszinkron távoli hívást kezdeményezhet, az ügyfélnek először inicializálnia kell az aszinkron kezelőt. Az ügyfél- és szerverprogramok az aszinkron kezelők RPC_ASYNC_STATE struktúrájának mutatóit használják.

Minden függőben lévő hívásnak saját egyedi aszinkron leíróval kell rendelkeznie. Az ügyfél létrehozza a leírót, és átadja az RpcAsyncInitializeHandle függvénynek. Ahhoz, hogy a hívás megfelelően befejeződjön, az ügyfélnek biztosítania kell, hogy a leíróhoz tartozó memória ne legyen felszabadítva, amíg meg nem kapja a kiszolgáló aszinkron válaszát. Mielőtt egy meglévő aszinkron leíróra újabb hívást indítanának, az ügyfélnek újra kell inicializálnia a leírót. Ennek elmulasztása esetén az ügyfélprogram csonk kivételt idézhet elő a hívás során. Az ügyfélnek arról is gondoskodnia kell, hogy az általa biztosított pufferek a [kimenő] és a [bemenő, kimenő] paraméterekhez aszinkron távoli eljárásnál lefoglalva maradjanak, amíg meg nem kapja a választ a kiszolgálótól.

Amikor aszinkron távoli eljárást hív meg, az ügyfélnek ki kell választania azt a metódust, amelyet az RPC futásidejű kódtár használ a hívás befejezéséről való értesítéséhez. Az ügyfél az alábbi módokon kaphat értesítést:

  • Esemény. Az ügyfél megadhat egy eseményt, amelyet a hívás befejezésekor aktiválni kell. További információ: Event Objects.

  • Szavazás Az ügyfél ismételten meghívhatja RpcAsyncGetCallStatus. Ha a visszatérési érték bármely más, mint az RPC_S_ASYNC_CALL_PENDING, akkor a hívás befejeződött. Ez a módszer több processzoridőt használ, mint az itt ismertetett többi módszer.

  • APC. Az ügyfél megadhat egy aszinkron eljáráshívást (APC), amely a hívás befejezésekor lesz meghívva. Az APC-függvény prototípusát lásd: RPCNOTIFICATION_ROUTINE. Az APC meghívása az RpcCallComplete eseményparaméterrel történik. Ahhoz, hogy az APC-k el legyenek küldve, az ügyfélszálnak riasztásos várakozási állapotban kell lennie.

    Ha a hThread mező az aszinkron leíróban 0 értékre van állítva, az APC-k várólistára kerülnek az aszinkron hívást kezdeményező szálon. Ha nem nulla, az APC-k az m által meghatározott szálra lesznek sorba állítva.

  • NOB. Az I/O-befejezési port értesítést kap az aszinkron fogantyúban megadott paraméterekkel. További információ: CreateIoCompletionPort.

  • Windows-leíró. A rendszer üzenetet küld a megadott ablakfogópontra (HWND).

Az alábbi kódrészlet bemutatja az alapvető lépéseket, amelyek szükségesek egy aszinkron leíró inicializálásához és annak használatához aszinkron távoli eljáráshívás végrehajtására.

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

Ahogy ez a példa is mutatja, az ügyfélprogram szinkron távoli eljáráshívásokat hajthat végre, miközben az aszinkron eljáráshívás még függőben van. Ez az ügyfél létrehoz egy eseményobjektumot az RPC futásidejű kódtárához, amely értesíti azt az aszinkron hívás befejeződésekor.

Jegyzet

Az aszinkron RPC-rutin nem küld értesítést a befejezésről, ha RPC-kivétel lép fel egy aszinkron hívás során.