异步远程 WMI 调用 C#
Asynchronous Remote WMI Calls C#
我真的很难以异步方式从远程主机获取 WMI 数据。经过大量研究,我找不到任何明确的例子,微软的文档只有 VB 和 C++ 代码,甚至还有文章解释为什么这是个坏主意。我来自 PowerShell,因此我只需创建一个新的运行空间来获取信息。
我目前有一个 WPF window,我想在更新 window 之前在查询信息时保持响应。我目前只设法使用 CimSession.Create 和 QueryInstance.
来使用同步调用
非常感谢您对此提供帮助:)
您可以使用 ORMi 异步方法来执行异步 WMI 工作。例如:
WMIHelper helper = new WMIHelper("root\CimV2");
List<Processor> processors = await helper.QueryAsync<Processor>().ToList();
在 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();
}
我真的很难以异步方式从远程主机获取 WMI 数据。经过大量研究,我找不到任何明确的例子,微软的文档只有 VB 和 C++ 代码,甚至还有文章解释为什么这是个坏主意。我来自 PowerShell,因此我只需创建一个新的运行空间来获取信息。
我目前有一个 WPF window,我想在更新 window 之前在查询信息时保持响应。我目前只设法使用 CimSession.Create 和 QueryInstance.
来使用同步调用非常感谢您对此提供帮助:)
您可以使用 ORMi 异步方法来执行异步 WMI 工作。例如:
WMIHelper helper = new WMIHelper("root\CimV2");
List<Processor> processors = await helper.QueryAsync<Processor>().ToList();
在 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();
}