다음을 통해 공유


System.Management를 사용하여 비동기 쿼리를 수행하는 방법

Configuration Manager 클라이언트 WMI(Windows Instrumentation) 네임스페이스에서 비동기 쿼리를 수행하려면 WQL 쿼리를 ManagementObjectSearcher 지정하는 개체를 만듭니다. 그런 다음 각 쿼리 결과 및 쿼리의 끝에 대한 이벤트 처리기를 지정하는 을 만듭니 ManagementOperationObserver 다.

개체 Get 메서드가 개체와 함께 호출되면 비동기 쿼리가 ManagementOperationObserver 실행됩니다ManagementObjectSearcher.

비동기 쿼리를 수행하려면

  1. Configuration Manager 클라이언트 WMI 네임스페이스에 대한 연결을 설정합니다. 자세한 내용은 System.Management를 사용하여 Configuration Manager 클라이언트 WMI 네임스페이스에 연결하는 방법을 참조하세요.

  2. 개체를 만듭니다 ManagementObjectSearcher .

  3. 개체를 만듭니다 ManagementOperationObserver .

  4. 메서드를 ObjectReadyEventHandler 개체에 ManagementOperationObserver 추가합니다.

  5. CompletedEventHandler 메서드를 추가합니다 ManagementOperationObserver.

  6. 개체 Get 메서드를 ManagementObjectSearcher 호출하고 개체를 ManagmentOperationObserver 매개 변수로 입력합니다.

  7. 쿼리가 실행되는 동안에도 애플리케이션이 계속 실행되는지 확인합니다.

예시

다음 C# 코드 예제에서는 클라이언트에 설치된 구성 요소를 비동기적으로 쿼리합니다.

샘플 코드 호출에 대한 자세한 내용은 System.Management를 사용하여 WMI 클래스 메서드를 호출하는 방법을 참조하세요.


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.

어셈블리

System.Management.

강력한 프로그래밍

발생할 수 있는 예외는 System.Management.ManagementException입니다.

참고 항목

Configuration Manager WMI 프로그래밍 정보
System.Management를 사용하여 WMI 클래스 메서드를 호출하는 방법
System.Management를 사용하여 Configuration Manager 클라이언트 WMI 네임스페이스에 연결하는 방법
System.Management를 사용하여 동기 쿼리를 수행하는 방법
System.Management를 사용하여 WMI 개체를 읽는 방법