C# AsParallel()和Any()?
我见过这样的代码,它使用C# AsParallel()和Any()?,c#,.net-4.0,plinq,C#,.net 4.0,Plinq,我见过这样的代码,它使用aspallel()和Any()检查条件: bool IsAnyDeviceConnected() { return m_devices.Any(d => d.IsConnected); } 为了加快速度: bool IsAnyDeviceConnected() { return m_devices.AsParallel().Any(d => d.IsConnected); } 但是看看Any(): internal static bool
aspallel()
和Any()
检查条件:
bool IsAnyDeviceConnected()
{
return m_devices.Any(d => d.IsConnected);
}
为了加快速度:
bool IsAnyDeviceConnected()
{
return m_devices.AsParallel().Any(d => d.IsConnected);
}
但是看看Any()
:
internal static bool Any<T>(this IEnumerable<T> source, Func<T, bool> predicate) {
foreach (T element in source) {
if (predicate(element)) {
return true;
}
}
return false;
}
问题:
我的诊断正确吗?DoesAny()
-一旦找到项,就不会取消其他线程(在AsParallel上下文中)
注意,我担心我可能会看到错误的源代码。返回一个ParallelQuery
,因此如果调用aspallel()。任何(…)
都不是在调用,而是在调用
可并行枚举的参考源代码。任何
都是
例如,当你深入到类中时,你会看到一个名为
resultFoundFlag
的标志被用来这样做。你看到的代码是错误的。返回一个并行查询
,并且并行查询
有另一个重载
“Any”创建一个新的AnyAllSearchOperator
对象并将其聚合。如果深入研究方法调用和对象链,您会发现queryopeningnumerator
确实支持取消
不幸的是,指向这些特定成员函数的引用源链接存在错误。您看到的代码是错误的
ParallelEnumerable.AsParallel
返回一个ParallelQuery
。ParallelEnumerable还定义了自己的扩展方法
为了指定取消、并行度等,您需要将ParallelEnumerable与XXX扩展方法一起使用,如和。ParallelEnumerable.Any不允许您指定那些选项来保留与
可枚举类似的签名。Any
您查看的源代码不正确。您需要查看哪一种方式比您看到的更复杂Enumerable.Any
bool IsAnyDeviceConnected()
{
var res = Parallel.ForEach(m_devices,
(d,loopState) => {
if (d.IsConnected)
loopState.Stop();
});
return !res.IsCompleted;
}