AsParallel()和Any()?

 手机用户2502928693 发布于 2022-12-27 11:48

我已经看过这个使用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(this IEnumerable source, Func predicate) {
            foreach (T element in source) {
                if (predicate(element)) {
                    return true;
                }
            }
            return false;
        }

我没有看到(显然) - 它确实关心取消其他工人 - 一旦找到.

但是 - 这个(其他)代码确实"尽快完成"+取消其他未来的工作:

bool IsAnyDeviceConnected()
{
   var res = Parallel.ForEach(m_devices,
      (d,loopState) => {  
         if (d.IsConnected) 
            loopState.Stop();
      });
   return !res.IsCompleted;
}

题 :

我的诊断是否正确?是Any()- 一旦找到项目,不会取消其他线程(在AsParallel上下文中)

嗯,我担心的是我可能会查看错误的源代码.

2 个回答
  • 你看错了代码.AsParallel返回一个ParallelQuery<TSource>,并ParellelQuery有另一个重载Any.

    '任何'创建一个新AnyAllSearchOperator对象并聚合它.如果你深入研究方法调用和对象链,你会发现它QueryOpeningEnumerator确实支持取消.


    不幸的是,那些特定成员函数的参考源链接被窃听.

    2022-12-27 11:51 回答
  • AsParallel()返回a ParallelQuery,所以如果你打电话给AsParallel().Any(...)你不打电话Enumerable.Any,但是ParallelEnumerable.Any.

    对于参考源代码ParallelEnumerable.Any是在这里.

    当您在AnyAllSearchOperatorEnumerator课堂上挖掘时,您会看到一个被调用的标志resultFoundFlag用于告诉其他工作人员找到结果,以便他们可以停止搜索.

    2022-12-27 11:51 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有