Parallel类是对线程很好的一个抽象。该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性。

Parallel类定义了并行的for和foreach的静态方法。Parallel类使用多个任务,因此使用多个线程来完成这个作业。

Parallel.For()和Parallel.Foreach()方法在每次迭代中调用相同的代码,而Parallel.Invoke()方法允许同时调用不同的方法。Parallel.Invoke用于任务并行性,而Parallel.Foreach用于数据并行性。

下面的例子前面两个参数表示从0到9迭代。第三个参数是一个Action委托。

     ParallelLoopResult result = Parallel.For(0,10,i=> {
Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
});

上面的例子使用Task.Delay(10);可以看到不一样的结果,分析线程和任务是如何执行的

            ParallelLoopResult result = Parallel.For(0,10,async i=> {
Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);
await Task.Delay(10); Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
}); Console.WriteLine("is completed:{0}", result.IsCompleted);

在输出中可以看到,调用 Task.Delay(10);后,线程发生了变化。任务不在存在,只留下线程,而且重用了前面的线程,还有一个重要的方面是,Parallel类的For方法并没有等待延迟,而是直接完成。它只等待它创建的任务,而不等待其他后台活动。

提前停止Parallel.For

可以提前终止所有迭代,调用ParallelLoopState的Break和Stop方法。如下:

ParallelLoopResult result = Parallel.For(10, 30, async (int i ,ParallelLoopState pls) => {

Console.WriteLine("{0},task:{1}", i, Task.CurrentId);

await Task.Delay(10);

if (i > 13)

pls.Break();

});

Console.WriteLine("is completed:{0}", result.IsCompleted);

Console.WriteLine("lowest break iteration:{0}",result.LowestBreakIteration);

Parallel.ForEach方法遍历是已异步方式遍历,没有确定遍历顺序。此方法的中断也For方法相同。

        string[] data = { "1","2","3","4","5",};
ParallelLoopResult result = Parallel.ForEach<string>(data, s => { Console.WriteLine(s); });

Parallle.Invoke方法允许传递一个Action委托数组,也就是可以并行调用多个方法。

static void Main()

{

Parallel.Invoke(Foo, Bar);

}

static void Foo()

{

Console.WriteLine(1);

}

static void Bar()

{

Console.WriteLine(2);

}

Parallel类的更多相关文章

  1. Parallel类(简化Task 操作)

    Parallel类 Parallel类是对线程的一个很好抽象.该类位于System.Threading.Tasks命名空间中,提供了数据和任务并行性. 1.用Parallel.For()方法循环 // ...

  2. 多线程之Parallel类

    Parallel类是对线程的一个抽象.该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性. Paraller类定义了数据并行地For和ForEach的静态方法,以及 ...

  3. C# 并行任务——Parallel类

    一.Parallel类 Parallel类提供了数据和任务的并行性: 二.Paraller.For() Paraller.For()方法类似于C#的for循环语句,也是多次执行一个任务.使用Paral ...

  4. 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)

    一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...

  5. 转载 [深入学习C#]C#实现多线程的方式:使用Parallel类

    简介 在C#中实现多线程的另一个方式是使用Parallel类. 在.NET4中 ,另一个新增的抽象线程是Parallel类 .这个类定义了并行的for和foreach的 静态方法.在为 for和 fo ...

  6. 数据与任务的并行---Parallel类

    Parallel类是对线程的抽象,提供数据与任务的并行性.类定义了静态方法For和ForEach,使用多个任务来完成多个作业.Parallel.For和Parallel.ForEach方法在每次迭代的 ...

  7. 一、并行编程 - 数据并行 System.Threading.Tasks.Parallel 类

    一.并行概念 1.并行编程 在.NET 4中的并行编程是依赖Task Parallel Library(后面简称为TPL) 实现的.在TPL中,最基本的执行单元是task(中文可以理解为"任 ...

  8. 【.Net】C#实现多线程的方式:使用Parallel类

    简介 在C#中实现多线程的另一个方式是使用Parallel类.  在.NET4中 ,另一个新增的抽象线程是Parallel类 .这个类定义了并行的for和foreach的 静态方法.在为 for和 f ...

  9. [深入学习C#]C#实现多线程的方式:使用Parallel类

    简介 在C#中实现多线程的另一个方式是使用Parallel类.  在.NET4中 ,另一个新增的抽象线程是Parallel类 .这个类定义了并行的for和foreach的 静态方法.在为 for和 f ...

随机推荐

  1. adaptive heuristic critic 自适应启发评价 强化学习

    https://www.cs.cmu.edu/afs/cs/project/jair/pub/volume4/kaelbling96a-html/node24.html [旧知-新知   强化学习:对 ...

  2. Qt中的通用模板算法QtAlgorithms(qDeleteAll,qBinaryFind,qCountLeadingZeroBits,qPopulationCount,qFill,qSwap,qSort)

    Qt在<QtAlgorithms>头文件中为我们提供了一系列的全局模板方法,这些模板方法主要用于容器操作,比如qDeleteAll().其在Qt中的声明如下: void qDeleteAl ...

  3. Python正则表达式Cheat sheet

    1.来源: Python Regular Expressions Cheat Sheet 2.内容: Special Characters ^ | Matches the expression to ...

  4. 怎样避免C#中将小数转换为字符串时出现科学记数法

    在C#中如果float.double.decimal类型的值,小数点后的0太多时,C#会用科学记数法来表示小数的值. 例如下面的double类型0.00009,如果我们直接将其用ToString()方 ...

  5. Machine Learning No.8: Clusting

    1. K-means algorithm 2. K-means optimization objective 3. Random initialization

  6. Android WiFi系统架构【转】

    本文转载自:http://blog.csdn.net/liuhaomatou/article/details/40398753 在了解WIFI模块的系统架构之前.我心中就有一个疑问,那么Android ...

  7. python中的编码转换

    今天遇到了一个问题,将字符串“\uxxxx\uxxxx”转换成汉字.网上查了很多资料都不行. 后来看到,发现一个函数就OK了. str = str.decode('unicode_escape') 等 ...

  8. linux应用之bugfree的安装及配置

    Bugfree3.0.4 Linux环境安装指南 bugfree系统安装的前提是,配置LAMP环境(apache+mysql+php),下面以centos6.3系统为例介绍bugfree3.0.4的安 ...

  9. Linux下查看端口占用情况

    用启动服务的账号登录,然后运行命令: lsof -i:<端口号> 也可使用命令: netstat -apn|grep <端口号> 找到进程号以后,再使用以下命令查看详细信息: ...

  10. Linux_服务器_05_CentOS 7安装完成后初始化的方法_Linux

    参考资料 1.CentOS 7安装完成后初始化的方法_Linux