【发布时间】:2020-11-05 14:12:23
【问题描述】:
我正在尝试使用 Microsoft.Management.Infrastructure 的 Async 版本,但我很难弄清楚如何使用 Reactive Extensions 进行会话管理。
这里有一些背景:
- 可以使用
CimSession.CreateAsync创建一个CIM 会话,返回IObservable -
CimSession.CreateAsync返回一个CimAsyncResult<T>,它包裹了CimAsyncDelegatedObservable<T> -
CimAsyncDelegatedObservable<T>does not disposeCimSession在任何时候,因此必须在不再需要CimSession时手动处理它。 - 获得
CimSession的句柄后,我尝试使用QueryInstancesAsync运行WQL 查询,例如session.QueryInstancesAsync(@"root\cimv2", "WQL", "SELECT Username FROM Win32_ComputerSystem")
如果CimSession 返回Tasks 而不是Observables,代码将非常简单:
using var session = CimSession.CreateAsync(".");
var results = session.QueryInstancesAsync(@"root\cimv2", "WQL", "SELECT Username FROM Win32_ComputerSystem");
但是由于Async 方法是使用Observables 实现的,我不确定如何将其转换为Observables 的惯用用法。当然,我可以使用 System.Reactive.Linq.Observable.ForEachAsync 将我的方法转换为 Tasks,但我想学习如何正确使用 Observables。
总结一下,我的问题是:
- 将
CimSession的生命周期绑定到Observable - 如果没有订阅者,如何确保
CimSession得到处理?我应该强制至少一个订阅者,但有工厂方法吗? - 当
QueryInstancesAsync的结果到达时如何处理CimSessionobservable?
【问题讨论】:
标签: c# .net .net-core system.reactive