Поделиться через


Выполнение асинхронного запроса с помощью System.Management

Чтобы выполнить асинхронный запрос к пространству имен WMI клиента Configuration Manager, создайте ManagementObjectSearcher объект, указывающий WQL-запрос. Затем создается ManagementOperationObserver объект , указывающий обработчик событий для каждого результата запроса, а также для конца запроса.

Асинхронный запрос выполняется при вызове ManagementObjectSearcherManagementOperationObserver метода Object Get с объектом .

Выполнение асинхронного запроса

  1. Настройте подключение к пространству имен WMI клиента Configuration Manager. Дополнительные сведения см. в разделе Подключение к пространству имен WMI клиента Configuration Manager с помощью System.Management.

  2. Создание ManagementObjectSearcher объекта.

  3. Создание ManagementOperationObserver объекта.

  4. ObjectReadyEventHandler Добавьте метод объекта ManagementOperationObserver .

  5. CompletedEventHandler Добавьте метод в .ManagementOperationObserver

  6. ManagementObjectSearcher Вызовите метод Get объекта и укажите объект в ManagmentOperationObserver качестве параметра.

  7. Убедитесь, что приложение по-прежнему выполняется во время выполнения запроса.

Пример

В следующем примере кода C# асинхронно запрашиваются компоненты, установленные на клиенте.

Сведения о вызове примера кода см. в статье Вызов метода класса WMI с помощью System.Management.


public void EnumerateInstancesAsync(ManagementScope scope)  
{  
    try  
    {  
        // Instantiate an object searcher with the query.  
        ManagementObjectSearcher searcher =  
            new ManagementObjectSearcher(scope, new  
            SelectQuery("CCM_InstalledComponent"));  

        // Create a results watcher object  
        // and handler for results and completion.  
        ManagementOperationObserver results = new  
            ManagementOperationObserver();  

        // Attach handler to events for results and completion.  
        results.ObjectReady += new  
            ObjectReadyEventHandler(this.NewObject);  
        results.Completed += new  
            CompletedEventHandler(this.Done);  

        Console.WriteLine("Installed Components");  
        Console.WriteLine("--------------------");  
        Console.WriteLine();  

        // Call the asynchronous overload of Get()  
        // to start the enumeration.  
        searcher.Get(results);  

        // Do something else while results  
        // arrive asynchronously.  
        while (!this.Completed)  
        {  
            System.Threading.Thread.Sleep(1000);  
        }  

        this.Reset();  
    }  
    catch (ManagementException e)  
    {  
        Console.WriteLine("Failed to run query: " + e.Message);  
        throw;  
    }  

}  

private bool isCompleted = false;  

private void NewObject(object sender,  
    ObjectReadyEventArgs obj)  
{  
    try  
    {  
        Console.WriteLine("Name: {0}, Version = {1}",  
            obj.NewObject["DisplayName"],  
            obj.NewObject["Version"]);  
    }  
    catch (ManagementException e)  
    {  
        Console.WriteLine("Error: " + e.Message);  
    }  

}  

private bool Completed  
{  
    get  
    {  
        return isCompleted;  
    }  
}  

private void Reset()  
{  
    isCompleted = false;  
}  

private void Done(object sender,  
         CompletedEventArgs obj)  
{  
    isCompleted = true;  
}  

Этот пример метода имеет следующие параметры:

Параметр Тип Описание
Scope ManagementScope Допустимый ManagementScopeобъект . Путь должен быть root\ccm.

Компиляция программы

Пространства имен

Системы.

System.Management.

Assembly

System.Management.

Надежное программирование

Можно вызвать исключение System.Management.ManagementException.

См. также

Сведения о программировании WMI Configuration Manager
Вызов метода класса WMI с помощью System.Management
Подключение к пространству имен WMI клиента Configuration Manager с помощью System.Management
Выполнение синхронного запроса с помощью System.Management
Чтение объекта WMI с помощью System.Management