作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我看过这段代码,它使用 AsParallel()
和 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;
}
我没有看到(显然)- 它确实关心其他 worker 的取消 - 一旦找到。
但是 - 这个(其他)代码确实“尽快完成”+取消其他 future 的工作:
bool IsAnyDeviceConnected()
{
var res = Parallel.ForEach(m_devices,
(d,loopState) => {
if (d.IsConnected)
loopState.Stop();
});
return !res.IsCompleted;
}
问题:
我的诊断是否正确? Any()
- 一旦找到 item ,不会取消其他线程(在 AsParallel 上下文中)
nb,我担心我可能看错了源代码。
最佳答案
AsParallel()
返回一个 ParallelQuery
,因此如果您调用 AsParallel().Any(...)
,您不会调用 Enumerable.Any
, 但是 ParallelEnumerable.Any
.
ParallelEnumerable.Any
的引用源代码是here .
当你挖掘时进入AnyAllSearchOperatorEnumerator
类,您会看到一个名为 resultFoundFlag
的标志用于 tell other workers that a result is found所以they can stop searching .
关于c# - AsParallel() 和 Any()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25379025/
我是一名优秀的程序员,十分优秀!