异步远程WMI调用C#

时间:2019-05-16 09:06:21

标签: c# asynchronous wmi remote-server

我真的很努力地以异步方式从远程主机获取WMI数据。经过大量研究,我找不到任何清晰的示例,Microsoft的文档仅包含VB和C ++代码,甚至有文章解释了为什么这样做是一个坏主意。我来自PowerShell,因此我将创建一个新的运行空间来获取信息。

我目前有一个WPF窗口,我想在更新窗口之前查询信息时保持响应状态。我目前只能通过CimSession.Create和QueryInstance使用同步调用。

我非常感谢您的帮助:)

2 个答案:

答案 0 :(得分:0)

您可以使用ORMi异步方法来执行WMI异步工作。例如:

WMIHelper helper = new WMIHelper("root\\CimV2");
List<Processor> processors = await helper.QueryAsync<Processor>().ToList();

答案 1 :(得分:0)

在向MSDN论坛提出相同的问题后,我得到了正确的答案,并认为我也将在这里分享它:)我已在代码中添加了注释以解释正在发生的事情:

//Used to define what is returned in the async results
public static CimAsyncMultipleResults<CimInstance> GetValues(CimSession _session)
{
    return _session.QueryInstancesAsync(@"root\cimv2", "WQL", "SELECT Username FROM Win32_ComputerSystem");
}

//This watches the async progress
class CimInstanceWatcher : IObserver<CimInstance>
{
    public void OnCompleted()
    {
        Console.WriteLine("Done");
    }

    public void OnError(Exception e)
    {
        Console.WriteLine("Error: " + e.Message);
    }

    public void OnNext (CimInstance value)
    {
        Console.WriteLine("Value: " + value);
    }
}

private static void Main()
{
    //Leaving cimsession creation as sync because is happens "instantly"
    CimSession Session = CimSession.Create("PC-NAME");
    //Creating a new watcher object
    var instanceObject = new CimInstanceWatcher();
    //Subscribing the watcher object to the async call
    GetValues(Session).Subscribe(instanceObject);
    Console.ReadLine();
}