如何在异步调用时让ManagementObjectSearcher返回ManagementObjectCollection?

时间:2015-01-26 20:13:35

标签: c# multithreading wmi

这是我的一些代码,有效:

SelectQuery query = new SelectQuery("Win32_SystemDriver")
{
    Condition = "Name = 'FTDIBUS'"
};
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection drivers = searcher.Get();

但我想异步调用它。我看到searcher.Get()有一个重载异步运行,它通过传递ManagementOperationObserver实例来工作。

我不知道的是如何实际让它返回同一个系列。这就是我到目前为止所拥有的:

private bool _completed = false;

public void QueryDrivers()
{
    SelectQuery query = new SelectQuery("Win32_SystemDriver")
    {
        Condition = "Name = 'FTDIBUS'"
    };
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    ManagementOperationObserver results = new ManagementOperationObserver();
    results.Completed += new CompletedEventHandler(QueryComplete);
    searcher.Get(results);

    while (!_completed)
    {
        Thread.Sleep(100);
    }

    // how do i access my ManagementObjectCollection here?
    //ManagementObjectCollection drivers = ????
}

private void QueryComplete(object sender, CompletedEventArgs e)
{
    _completed = true;
}

1 个答案:

答案 0 :(得分:0)

订阅ObjectReady,您将在那里一一收到所有ManagementObjects:

results.ObjectReady+= Obs_ObjectReady;

...

// this will get called as many times as you have objects in the expected collection
private void Obs_ObjectReady(object sender, ObjectReadyEventArgs e)
{
   var obj = e.NewObject as ManagementObject;
}