gpt4 book ai didi

c# - AsParallel() 和 Any()?

转载 作者:太空狗 更新时间:2023-10-29 19:55:50 33 4
gpt4 key购买 nike

我看过这段代码,它使用 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com