使用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,所以为什么它抱怨)?
它实现了非通用的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
});