使用Parallel.ForEach(..)处理一个managetobjectcollection

本文关键字:一个 managetobjectcollection 处理 Parallel 使用 ForEach | 更新日期: 2023-09-27 18:04:09

我使用以下代码并行处理managentobjectcollection中的所有项:

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, managetobjectcollection实现IEnumerable,所以为什么它抱怨)?

使用Parallel.ForEach(..)处理一个managetobjectcollection

它实现了非通用的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
});
相关文章: