使用 Parallel.ForEach(...) 处理 ManagementObjectCollection

Processing a ManagementObjectCollection using Parallel.ForEach(...)

我正在使用以下代码并行处理 ManagementObjectCollection 中的所有项目:

using (ManagementObjectCollection results = this._searcher.Get())
{
    // The type arguments for method Parallel.ForEach<TSource>(...) cannot be inferred from usage
    Parallel.ForEach(results, (mo, loopState) =>
    {
        // process mo
    });
}

如果我指定一个类型,它就会抱怨这个

using (ManagementObjectCollection results = this._searcher.Get())
{
    // Cannot convert from ManagementObjectCollection to [..].IEnumereable<ManagementObject>
    Parallel.ForEach<ManagementObject>(results, (mo, loopState) =>
    {
        // process mo
    });
}

我怎样才能让它正常工作?为什么第二个代码块不起作用(AFAICS,ManagementObjectCollection 实现了 IEnumerable 所以它为什么抱怨)?

它实现了非通用 IEnumerable 接口,因此使其成为 IEnumerable<object>,而不是 IEnumerable<ManagementObject>

我建议使用 Cast<T> 进行转换,这将在您迭代时转换每个元素:

Parallel.ForEach(results.Cast<ManagementObject>(),
                (mo, loopState) =>
{
    // process mo
});

如果出于某种原因你需要强类型列表,你可以在之前转换它:

var managementObjects = results.Cast<ManagementObject>().ToList();
Parallel.ForEach(managementObjects, (mo, loopState) =>
{
    // process mo
});