使用 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
});
我正在使用以下代码并行处理 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
});