Aracılığıyla paylaş


Zaman Uyumsuz Sorgu çağırma

Zaman uyumsuz bir sorgu, yazması biraz daha karmaşık olsa da, sistem veya ağ performansı büyük bir veri grubunun sorgulanmasından etkilenecekse tercih edilen sorgu türüdür. Betikte, temel sorgunun dışında sadece ek görev olarak, sink'in alabileceği olayları işlemek için SWbemSink nesnesi ve alt yordamları oluşturmak yer alır.

Not

Çünkü arka uca yapılan geri çağırma, istemcinin gerektirdiği kimlik doğrulama düzeyinde olmayabilir, zaman uyumsuz iletişim yerine yarı zaman uyumlu iletişim kullanmanız önerilir. Daha fazla bilgi için bkz. Yöntem çağırma.

 

Aşağıdaki kısaltılmış betik, yerel makinedeki tüm veri dosyaları için sorgular. Bu sorgu bir ağdaki tüm makineler için yürütülürse çok fazla zaman alabilir. bir SWbemSink nesnesi ayarlanır ve işlenen tek olay OnCompleted olayıdır.

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

Betikte zaman uyumsuz yöntem çağrıları oluşturma hakkında ayrıntılı bilgi için bkz. Bir Yöntem Çağırma.

C++ uygulamalarında zaman uyumsuz bir sorgu, sorgu verilerini almak için ayrı bir işlem oluşturur. Zaman uyumsuz sorgu, zaman uyumlu sorgudan daha karmaşıktır çünkü çok iş parçacıklı bir uygulamayı kodlamalısınız. Ancak, zaman uyumsuz bir sorgu, uygulamanızın ana iş parçacığını meşgul etmez.

Aşağıdaki yordamda, C++'da zaman uyumsuz sorgunun nasıl gerçekleştirileceği açıklanmaktadır.

C++ zaman uyumsuz sorgu gerçekleştirmek için

  1. bir IWbemSink nesnesi uygulayın.

    IWbemSink nesnesi zaman uyumsuz bir işlem hakkında bilgi alır.

  2. sorgunuzu IWbemServices::ExecQueryAsyncçağrısında açıklayın.

    WMI, CIM'yi sorgulayan işlemi hemen başka bir iş parçacığına taşır ve başka bir görev için sorguyu yürüten iş parçacığını boşaltır.

  3. WMI'nin IWbemObjectSink::Indicate yöntemini çağırmasını bekleyin.

    Tamamlandığında WMI, uygulamanıza sorgunun tamamlandığını göstermek için aracılığıyla belirtir. WMI ayrıca IEnumWbemClassObject arabirim işaretçisinin işaretçisi olarak havuza sorgunun sonuçlarını döndürür. Zaman uyumlu sorguda olduğu gibi, sorgunuzun sonucunu oluşturan nesnelere erişmek için işaretçiyi kullanın.

QuerySink sınıfı tanımlanmadığından aşağıdaki kod örneği hata olmadan derlenmiyor. QuerySink sınıfının tanımı için bkz. IWbemObjectSink. Kod örneği ayrıca aşağıdaki referans ve #include deyimlerini gerektirir.

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

Aşağıdaki kod örneğinde, sorgu vermek için zaman uyumsuz bir çağrının nasıl yapılacağı gösterilmektedir.

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");
}

Daha fazla bilgi için bkz. Yöntem çağırma.