Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AsParallel()和Any()?_C#_.net 4.0_Plinq - Fatal编程技术网

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;
        }
问题:

我的诊断正确吗?Does
Any()
-一旦找到项,就不会取消其他线程(在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;
}