并行Linq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Threading;
using System.Diagnostics;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            //并行LINQ
            //******************************************************
            //测试时间
            Stopwatch sw = Stopwatch.StartNew();
            long l = sw.ElapsedMilliseconds;
            //******************************************************
 
            const int maxsize = 100000000;
            var data = new int[maxsize];
            Random ran = new Random();
            for (int i = 0; i < maxsize; i++)
            {
                checked
                {
                    data[i] = ran.Next(40);
                }
            }
            //===========================================并行查询
            //AsParallel() 启用查询的并行化
            //AsParallel() 返回ParallelQuery<T>,所以Where()、Select()等方法不在返回IEnumerable<T>,而返回ParallelQuery<T>
            var query = (from r in data.AsParallel()
                         select r).Take(20).Select(r => r);
            Foreach(query);
            Console.WriteLine(data.AsParallel().Where(r => r < 20).Sum());

            //===========================================分区器
            List<int> il = Enumerable.Range(0, 10000).ToList();
            //WithExecutionMode(ParallelExecutionMode.ForceParallelism) //强制并行化整个查询
            //WithDegreeOfParallelism() //指定最大任务数
            var query2 = (from r in Partitioner.Create(il, true).AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism)
                          where r < 20
                          select r).Sum();
            Console.WriteLine("====================================");
            Console.WriteLine(query2);
            Console.WriteLine("====================================");
            //===========================================取消长时间运行的任务
            var token = new CancellationTokenSource();
            new Thread(() =>
            {
                try
                {
                    var query3 = (from r in il.AsParallel().WithCancellation(token.Token)
                                  where r < 20
                                  select r
                                    ).Sum();
                    Console.WriteLine(query3);
                }
                catch (Exception e) { Console.WriteLine(e); }
            }).Start();
            if (Console.ReadLine() == "y" || Console.ReadLine() == "Y")
            {
                token.Cancel();
            }

            Console.ReadKey();
        }
        public static void Foreach<T>(IEnumerable<T> s)
        {
            Console.WriteLine("==================================");
            foreach (var item in s)
            {
                Console.WriteLine(item);
            }
        }
    }
}
时间: 2024-10-07 19:11:25

并行Linq的相关文章

C#高级编程六十三天----并行LINQ

并行LINQ .NET4在System.Linq命名空间中包含一个新类ParallelEnumerable,可以分解查询的工作使其分布在多个线程上.尽管Enumerable类给IEnumerable<T>接口定义了扩展方法,但ParallelEnumerable类的大多数扩展方法是ParallelQuery<TSource>类的扩展.一个重要的例外是AsParallel()方法,它扩展了IEnumerable<TSource>接口,返回ParallelQuery<

C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)

学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式). --用AggregateException处理Task上的未处理异常. --取消任务. CancellationToken --async修饰方法, 返回Task. task.wait(100)可以阻塞现场. a

【c#基础】并行Linq

并行:指在同一时刻,有多条指令在多个处理器上同时执行 并发:指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行 并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生. 串行:A和B两个任务运行在一个CPU线程上,在A任务执行完之前不可以执行B.即,在整个程序的运行过程中,仅存在一个运行上下文,即一个调用栈一个堆.程序会按顺序执行每个指令. 原文地

.NET 实现并行的几种方式(三)

本随笔续接:.NET 实现并行的几种方式(二) 在前两篇随笔中,先后介绍了 Thread .ThreadPool .IAsyncResult (即 APM系列) .Task .TPL (Task Parallel Library). 写到这些笔者突然意识到 还有一个EMP系列没有写,在这里补充一下: 六. EPM .EPM中的典型代表是 WebClient: EPM系列采用 ***Async方法 + ***Completed事件 的编码规范,不做太多解释.具体的demo如下: var addre

C#中的多线程 - 并行编程 z

原文:http://www.albahari.com/threading/part5.aspx 专题:C#中的多线程 1并行编程Permalink 在这一部分,我们讨论 Framework 4.0 加入的多线程 API,它们可以充分利用多核处理器. 并行 LINQ(Parallel LINQ)或称为 PLINQ Parallel类 任务并行(task parallelism)构造 SpinLock 和 SpinWait 这些 API 可以统称为 PFX(Parallel Framework,并行

LINQ基础(三)

一.并行LINQ System.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上. 尽管Enumerable类给IEnumerable<T>接口定义了扩展方法,但ParallelEnumerable类的大多数扩展方法是ParallerQuery<TSource>类的扩展.例如,AsParallel()方法,它扩展了IEnumerable<T>接口,返回ParallelQuery<T>类,所以正常的集合类可

14.1 理解不同的并行技术

在这一节,我们将讨论三种技术,并使用简单的示例进行演示.我们将使用的 .NET并行扩展(Parallel Extensions to .NET),是并行编程库,它是 .NET Framework 4.0 标准的一部分,但是,不幸的是,在早期 .NET 的版本中没有.如果要在 Visual Studio 2008 中体验并行扩展,可以下载 CTP 版本,但有几个命名上的改变(实际上,Visual Studio 2010 应该没有这个问题了). .NET 的并行扩展(Parallel Extensi

.Net并行编程之二:并行循环

本篇内容主要包括: 1.能够转化为并行循环的条件 2.并行For循环的用法:Parallel.For 3.并行ForEach的用法Parallel.ForEach 4.并行LINQ(PLINQ)的用法AsParallel() 5.并行中断与并行停止的用法与区别 6.外部控制循环取消的方法(Break,Stop) 7.处理循环体中抛出的异常 8.小循环体的分区并行方法:Parallel.ForEach 9.最大并行度的控制,Parallel.For,Parallel.ForEach 10.在循环体

状态机/迭代器/LINQ/协程

状态机 有限状态机(Finite State Machine 或 Finite State Automata)是软件领域中一种重要的工具. 状态机允许一个对象在其内部状态改变时改变它的行为.对象内部状态决定行为方式,对象状态改变行为方式改变,这里强调内部状态. Command 模式是将命令请求封装成一个为对象,将不同的请求对象参数化以达到同样的调用执行不同的命令: State 模式是将对象的状态封装成一个对象,是在不同的状态下同样的调用执行不同的操作. 迭代器是一个典型的状态机例子,后续会讲解.