Bagikan melalui


Melakukan Panggilan Asinkron

Sebelum dapat melakukan panggilan jarak jauh asinkron, klien harus menginisialisasi handel asinkron. Program klien dan server menggunakan pointer ke struktur RPC_ASYNC_STATE untuk handel asinkron.

Setiap panggilan yang luar biasa harus memiliki handel asinkron uniknya sendiri. Klien membuat handel dan meneruskannya ke fungsi RpcAsyncInitializeHandle . Agar panggilan selesai dengan benar, klien harus memastikan bahwa memori untuk handel tidak dirilis sampai menerima balasan asinkron server. Selain itu, sebelum melakukan panggilan lain pada handel asinkron yang ada, klien harus menginisialisasi ulang handel. Kegagalan untuk melakukan ini dapat menyebabkan stub klien menimbulkan pengecualian selama panggilan. Klien juga harus memastikan bahwa buffer yang disediakannya untuk parameter [out] dan parameter [in, out] ke prosedur jarak jauh asinkron tetap dialokasikan sampai menerima balasan dari server.

Ketika memanggil prosedur jarak jauh asinkron, klien harus memilih metode yang akan digunakan pustaka run-time RPC untuk memberi tahunya tentang penyelesaian panggilan. Klien dapat menerima pemberitahuan ini dengan salah satu cara berikut:

  • Kejadian. Klien dapat menentukan peristiwa yang akan ditembakkan ketika panggilan telah selesai. Untuk detailnya, lihat Objek Peristiwa.

  • Polling. Klien dapat berulang kali memanggil RpcAsyncGetCallStatus. Jika nilai yang dikembalikan adalah apa pun selain RPC_S_ASYNC_CALL_PENDING, panggilan selesai. Metode ini menggunakan lebih banyak waktu CPU daripada metode lain yang dijelaskan di sini.

  • APC. Klien dapat menentukan panggilan prosedur asinkron (APC) yang dipanggil ketika panggilan selesai. Untuk prototipe fungsi APC, lihat RPCNOTIFICATION_ROUTINE. APC dipanggil dengan parameter Peristiwanya diatur ke RpcCallComplete. Agar APC dikirim, utas klien harus dalam status tunggu yang dapat diperingatkan.

    Jika bidang hThread dalam handel asinkron diatur ke 0, APC diantrekan pada utas yang melakukan panggilan asinkron. Jika bukan nol, APC diantrekan pada utas yang ditentukan oleh m.

  • IOC. Port penyelesaian I/O diberi tahu dengan parameter yang ditentukan dalam handel asinkron. Untuk informasi selengkapnya, lihat CreateIoCompletionPort.

  • Handel Windows. Pesan diposting ke handel jendela yang ditentukan (HWND).

Fragmen kode berikut menunjukkan langkah-langkah penting yang diperlukan untuk menginisialisasi handel asinkron dan menggunakannya untuk melakukan panggilan prosedur jarak jauh asinkron.

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

Seperti yang ditunjukkan oleh contoh ini, program klien Anda dapat menjalankan panggilan prosedur jarak jauh yang sinkron saat panggilan prosedur asinkron masih tertunda. Klien ini membuat objek peristiwa untuk pustaka run-time RPC yang akan digunakan untuk memberi tahunya ketika panggilan asinkron selesai.

Catatan

Pemberitahuan penyelesaian tidak akan dikembalikan dari rutinitas RPC asinkron jika pengecualian RPC dinaikkan selama panggilan asinkron.