Bagikan melalui


Model Asinkron

Sebagian besar operasi di Windows Web Services API dapat dilakukan secara sinkron atau asinkron. Untuk memanggil fungsi secara sinkron, berikan nilai null untuk struktur WS_ASYNC_CONTEXT. Untuk menentukan bahwa fungsi dapat dilakukan secara asinkron, teruskan WS_ASYNC_CONTEXT non-null ke fungsi .

Ketika dipanggil secara asinkron, fungsi tetap dapat selesai secara sinkron atau asinkron. Jika fungsi selesai secara sinkron, fungsi mengembalikan nilai yang menunjukkan keberhasilan atau kesalahan akhir, dan nilai ini selalu sesuatu selain WS_S_ASYNC (Lihat Windows Web Services Mengembalikan Nilai). Nilai pengembalian WS_S_ASYNC, namun, menunjukkan bahwa fungsi akan selesai secara asinkron. Ketika fungsi selesai secara asinkron, panggilan balik dipanggil untuk memberi sinyal penyelesaian operasi. Panggilan balik ini menunjukkan nilai keberhasilan akhir atau kesalahan. Panggilan balik tidak dipanggil jika operasi selesai secara sinkron.

Untuk membuat konteks asinkron, inisialisasi panggilan balik dan bidang callbackState struktur WS_ASYNC_CONTEXT. Bidang callbackState digunakan untuk menentukan penunjuk ke data yang ditentukan pengguna yang diteruskan ke fungsi WS_ASYNC_CALLBACK.

Contoh berikut menunjukkan panggilan fungsi secara asinkron dengan meneruskan penunjuk ke struktur WS_ASYNC_CONTEXT yang berisi panggilan balik dan penunjuk ke data status.

HRESULT ExampleAsyncFunction(WS_ASYNC_CONTEXT* asyncContext);
void ExampleAsyncFunction()
{
    // Set up the WS_ASYNC_CONTEXT structure.
    MyState* myState = ...;  \\ Declare a pointer to user-defined data.
    WS_ASYNC_CONTEXT asyncContext;
    asyncContext.callback = MyCallback;  \\ Set the callback.
    asyncContext.callbackState = myState; \\ Set the pointer to the user-defined data.

    // Start the asynchronous operation
    HRESULT hr = SomeFunction(&asyncContext);

    if (hr == WS_S_ASYNC)
    {
        // The operation is completing asynchronously.  The callback is called 
        // when the operation is complete.
    }
    else
    {
        // The operation completed synchronously.  The callback is not called.
    }
}
void CALLBACK MyCallback(HRESULT hr, WS_CALLBACK_MODEL callbackModel, void* callbackState)
{
    MyState* myState = (MyState*)callbackState;

    // The operation completed asynchronously.
}

Struktur WS_ASYNC_CONTEXT digunakan oleh fungsi asinkron hanya untuk durasi panggilan fungsi (bukan untuk durasi operasi asinkron), sehingga Anda dapat dengan aman mendeklarasikannya pada tumpukan.

Jika ada parameter lain, selain struktur WS_ASYNC_CONTEXT, diteruskan ke fungsi asinkron sebagai penunjuk dan fungsi selesai secara asinkron, adalah tanggung jawab pemanggil untuk menjaga nilai yang ditunjuk oleh parameter ini tetap hidup (tidak dibebaskan) sampai panggilan balik asinkron dipanggil.

Ada batasan pada operasi apa yang dapat dilakukan panggilan balik. Untuk informasi selengkapnya tentang kemungkinan operasi , lihat WS_CALLBACK_MODEL.

Ketika Anda menerapkan fungsi asinkron, jangan panggil panggilan balik pada utas yang sama yang disebut fungsi asinkron sebelum fungsi asinkron telah kembali ke pemanggil, karena ini mengganggu model asinkron.

Saat menerapkan fungsi yang perlu menjalankan serangkaian operasi asinkron, pertimbangkan untuk menggunakan fungsi WsAsyncExecute helper.

Contoh Fungsi Asinkron menunjukkan cara mengimplementasikan dan menggunakan fungsi yang mengikuti model asinkron.

Memulai operasi IO asinkron menggunakan sumber daya sistem. Jika operasi IO yang cukup dimulai, sistem dapat menjadi tidak responsif. Untuk mencegah hal ini, aplikasi perlu membatasi jumlah operasi asinkron yang dimulainya.

Model asinkron menggunakan elemen API berikut.

Callback Deskripsi
WS_ASYNC_CALLBACK Parameter fungsi panggilan balik yang digunakan dengan model asinkron.
WS_ASYNC_FUNCTION Digunakan denganWsAsyncExecuteuntuk menentukan fungsi berikutnya yang akan dipanggil dalam serangkaian operasi asinkron.

 

Enumerasi Deskripsi
WS_CALLBACK_MODEL Menentukan perilaku utas panggilan balik (misalnya, WS_ASYNC_CALLBACK).

 

Fungsi Deskripsi
WsAsyncExecute Memanggil panggilan balik yang ditentukan pengguna yang dapat memulai operasi asinkron dan menunjukkan fungsi yang harus dipanggil ketika operasi asinkron telah selesai.

 

Struktur Deskripsi
WS_ASYNC_CONTEXT Menentukan panggilan balik asinkron dan penunjuk ke data yang ditentukan pengguna, yang akan diteruskan ke panggilan balik asinkron.
WS_ASYNC_OPERATION Digunakan denganWsAsyncExecuteuntuk menentukan fungsi berikutnya yang akan dipanggil dalam serangkaian operasi asinkron.
WS_ASYNC_STATE Digunakan oleh WsAsyncExecute untuk mengelola status operasi asinkron.

 

Contoh Fungsi Asinkron

WS_ASYNC_CALLBACK

WS_ASYNC_CONTEXT

WS_CALLBACK_MODEL

WsAsyncExecute