Memanggil Kueri Asinkron

Kueri asinkron, meskipun agak lebih kompleks untuk ditulis, adalah jenis kueri yang disukai ketika performa sistem atau jaringan akan terpengaruh dengan mengkueri sekelompok besar data. Dalam skrip, membuat objek SWbemSink dan subroutine untuk menangani peristiwa yang dapat diterima sink adalah satu-satunya tugas tambahan di luar kueri dasar.

Nota

Karena panggilan balik ke sink mungkin tidak dikembalikan pada tingkat autentikasi yang sama seperti yang dibutuhkan klien, disarankan agar Anda menggunakan komunikasi semisinkron daripada asinkron. Untuk informasi selengkapnya, lihat Memanggil Sebuah Metode.

 

Kueri skrip yang disingkat berikut untuk semua file data di komputer lokal. Kueri ini dapat memakan waktu yang berlebihan jika dijalankan untuk semua komputer di jaringan. Sebuah objek SWbemSink disiapkan dan satu-satunya event yang ditangani adalah event OnCompleted.

Sub SINK_OnCompleted(iHResult, objErrorObject, objAsyncContext)
    WScript.Echo "Asynchronous operation is done."
End Sub

Set service = GetObject("winmgmts:")
Set sink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
service.ExecQueryAsync sink, "SELECT * FROM Win32_DataFile"
WScript.Echo "Waiting for instances."
sink.Cancel()
set sink= Nothing

Untuk informasi terperinci tentang membuat panggilan metode asinkron dalam skrip, lihat Memanggil Metode.

Dalam aplikasi C++, kueri asinkron menghasilkan proses terpisah untuk menerima data kueri. Kueri asinkron lebih kompleks daripada kueri sinkron, karena Anda harus membuat kode aplikasi multithread. Namun, kueri asinkron tidak memonopoli thread utama aplikasi Anda.

Prosedur berikut menjelaskan cara melakukan kueri asinkron di C++.

Untuk melakukan kueri asinkron di C++

  1. Implementasikan objek IWbemSink.

    Objek IWbemSink menerima informasi tentang operasi asinkron.

  2. Jelaskan kueri Anda dalam panggilan ke IWbemServices::ExecQueryAsync.

    WMI segera memindahkan proses yang melakukan kueri terhadap CIM ke utas lain dan membebaskan utas yang menjalankan kueri untuk digunakan pada tugas lain.

  3. Tunggu sampai WMI memanggil metode IWbemObjectSink::Indicate.

    Setelah selesai, WMI memanggil Menandakan untuk memberi sinyal kepada aplikasi Anda bahwa kueri telah selesai. WMI juga mengembalikan hasil kueri ke sink sebagai pointer ke antarmuka IEnumWbemClassObject. Seperti halnya kueri sinkron, gunakan penunjuk untuk mengakses objek yang membentuk hasil kueri Anda.

Contoh kode berikut tidak dikompilasi tanpa kesalahan karena kelas QuerySink belum ditentukan. Untuk definisi kelas QuerySink, lihat IWbemObjectSink. Contoh kode juga memerlukan referensi dan pernyataan #include berikut.

#include <iostream>
using namespace std;
#include <wbemidl.h>

Contoh kode berikut menunjukkan cara melakukan panggilan asinkron untuk mengeluarkan kueri.

void ExecQuery(IWbemServices *pSvc)
{
    // Create a new sink object.
    QuerySink *pSink = new QuerySink;

    // Initialize the query and query language.
    BSTR strQuery = SysAllocString(L"SELECT * FROM ClassName");
    BSTR strQueryLang = SysAllocString(L"WQL");
    
    // Issue the query.
    HRESULT hRes = pSvc->ExecQueryAsync(strQueryLang, strQuery, 0,
        NULL, pSink);

    // Clean up.
    SysFreeString(strQuery);
    SysFreeString(strQueryLang);
    
    if (hRes)
    {
        printf("ExecQueryAsync failed with = 0x%X\n", hRes);
        return;
    }
    
    printf("Completed.\n");
}

Untuk informasi selengkapnya, lihat Memanggil Metode.