c# - C# 中 AsParallel 和 AsParallel.Select 的区别

标签 c# task-parallel-library

我想知道 C# 中 AsParallel 和 AsParallel.Select() 之间的区别是什么,因为两者都返回 AsParallelQuery 的实例。 考虑以下代码片段:

var list = Enumerable.Range(1, 100).ToList();

            var parallelList = list.AsParallel();
            foreach (var num in parallelList)
                System.Console.WriteLine(num);//returns 1 ..100 in order

            var query = list.AsParallel().Select(num => num); 

            foreach (var num in query)
                System.Console.WriteLine(num);/*returns 1..100 not in order*/

            parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order

我想知道 list.AsParallel() 和 list.AsParallel().Select() 的解释有何不同

最佳答案

AsParallel() 的作用是,这意味着任何后续的 LINQ 方法都将并行执行。它直接影响的是foreach的行为方式。

所以,这个:

var parallelList = list.AsParallel();

foreach (var num in parallelList)
    System.Console.WriteLine(num);//returns 1 ..100 in order

只是一种令人困惑的迭代列表的方式。它不会并行化任何东西。

虽然这样:

var query = list.AsParallel().Select(num => num); 

foreach (var num in query)
    System.Console.WriteLine(num);/*returns 1..100 not in order*/

并行执行(无用的)Select 查询,这可能会更改元素的顺序。但 foreach 仍然在单个线程上执行。

最后,这个:

parallelList.ForEach(System.Console.WriteLine); //returns 1 ..100 in order

不会编译,除非您有一些自定义的ForEach扩展方法,其行为可能与foreach相同。 (有 ForAll,但这是不同的。)

关于c# - C# 中 AsParallel 和 AsParallel.Select 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44403638/

相关文章:

c# - 使用 await 时 Monitor.Exit 上的 SynchronizationLockException

c# - 将秒表与异步方法一起使用

c# - 在 Windows 服务中使用 ConfigureAwait(false)?

c# - 用于 TPL 数据流的 BroadcastCopyBlock 保证交付

c# - 通过键从字典中获取项目

c# - 实例化包含 static void Main() 的类

c# - 如何从字符串中删除破折号以外的所有非字母数字字符?

c# - 未应用 Wpf 按钮样式

c# - 在 C# 中从自定义 GUI 运行外部命令

c# - 具有异步任务方法的对象列表,并发执行