本文主要介绍Parallel.Invoke的使用。

一、使用例子

 class ParallelInvoke
{
public void Action1()
{
Thread.Sleep();
Console.WriteLine("in action1");
} public void Action2()
{
Thread.Sleep();
Console.WriteLine("in action2");
} public void ParallelAction()
{
Parallel.Invoke(() => Action1(), () => Action2());
}
}
 class Program
{
static void Main(string[] args)
{
var stopwatch = Stopwatch.StartNew();
stopwatch.Start();
new ParallelInvoke().ParallelAction();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.Read();
}
}

二、 运行截图

上面的action1和action2如果并行执行至少需要3000*2毫秒,但是使用Invoke,内部并行执行,时间减半。

三、 分析

Parallel.Invoke是最简单的并行编程模型,用于并行执行多个互不相干的方法。有几点需要注意

  1. 只有当所有的Action执行完成后Invoke才会返回(WaitAll)
  2. 在执行过程中有其中一个Action发生异常,Invoke不会马上抛出异常,而是等所有的Action完成以后再次抛出异常

四、one more thing

4.1 MaxDegreeOfParallelism

Parallel.Invoke可以通过指定ParallelOption指定最大并行数量。

    public void ParallelAction()
{
Parallel.Invoke
(
new ParallelOptions()
{
MaxDegreeOfParallelism = ,
},
() => Action1(),
() => Action2()
);
}

上面的代码设置成了1,其实就是串行执行了。

执行时间如下。

4.2 CancellationSourceToken

同样可以通过ParallelOption指定CancellationSourceToken,多个并行任务之间可以协调取消

   class ParallelInvoke
{
public void Action1(CancellationTokenSource cts)
{
cts.Cancel();
Thread.Sleep();
Console.WriteLine("in action1");
} public void Action2(CancellationTokenSource cts)
{
if (cts.IsCancellationRequested)
{
return;
}
Thread.Sleep();
Console.WriteLine("in action2");
} public void ParallelAction()
{
CancellationTokenSource cts = new CancellationTokenSource(); Parallel.Invoke
(
new ParallelOptions()
{
CancellationToken = cts.Token,
},
() => Action1(cts),
() => Action2(cts)
);
}

Parallel Programming-Parallel.Invoke的更多相关文章

  1. Fork and Join: Java Can Excel at Painless Parallel Programming Too!---转

    原文地址:http://www.oracle.com/technetwork/articles/java/fork-join-422606.html Multicore processors are ...

  2. Notes of Principles of Parallel Programming - TODO

    0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...

  3. 4.3 Reduction代码(Heterogeneous Parallel Programming class lab)

    首先添加上Heterogeneous Parallel Programming class 中 lab: Reduction的代码: myReduction.c // MP Reduction // ...

  4. Task Cancellation: Parallel Programming

    http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...

  5. Samples for Parallel Programming with the .NET Framework

    The .NET Framework 4 includes significant advancements for developers writing parallel and concurren ...

  6. Parallel Programming for FPGAs 学习笔记(1)

    Parallel Programming for FPGAs 学习笔记(1)

  7. Parallel Programming AND Asynchronous Programming

    https://blogs.oracle.com/dave/ Java Memory Model...and the pragmatics of itAleksey Shipilevaleksey.s ...

  8. Introduction to Multi-Threaded, Multi-Core and Parallel Programming concepts

    https://katyscode.wordpress.com/2013/05/17/introduction-to-multi-threaded-multi-core-and-parallel-pr ...

  9. A Pattern Language for Parallel Programming

    The pattern language is organized into four design spaces.  Generally one starts at the top in the F ...

  10. parallel programming. this causual litery nots represents my recent progress in parallel programming in c#.It`s interesting.

    not to say extra words,let`s start the code. pasted below: using System; using System.Collections.Ge ...

随机推荐

  1. 问题:今天测试模块一直出现一个问题?module 'subprocess' has no attribute 'Popen'

    原因:我起的名字用了模块本身的名字,这个地方一定要切记

  2. php在web端播放amr语音(如微信语音)

    在使用微信JSSDK的上传下载语音接口时,发现一个问题: 下载的语音在iPhone上不能播放,测试了之后原因竟然是: 微信接口返回的音频内容是amr格式的,但iPhone不支持播放此类型格式. 那么转 ...

  3. Centos 6 安装 python2.7 和 pip

    一.安装 python2.7 [root@crazy-acong ~]# cd /data/tools/ [root@crazy-acong tools]# yum groupinstall &quo ...

  4. inux c编程:读写锁

    前面介绍的互斥量加锁要么是锁状态,要么就是不加锁状态.而且只有一次只有一个线程可以对其加锁.这样的目的是为了防止变量被不同的线程修改.但是如果有线程只是想读而不会去写的话,这有不会导致变量被修改.但是 ...

  5. Ubuntu 14.04 或者16.04开启root账户登录和图形界面登录root时候的报错解决方法

    1.打开终端 2.输入sudo vi /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 3.添加一行:greeter-show-manual-login ...

  6. oracle游标用法

    -- 声明游标:CURSOR cursor_name IS select_statement  --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...

  7. session不能使用 ASP.NET MVC

    在web.coonfig中添加 <sessionState mode=" /> 如: <system.web> //... <sessionState mode ...

  8. 《python基础教程(第二版)》学习笔记 文件和素材(第11章)

    <python基础教程(第二版)>学习笔记 文件和素材(第11章) 打开文件:open(filename[,mode[,buffering]]) mode是读写文件的模式f=open(r' ...

  9. Git 远程仓库 git remote

    http://blog.csdn.net/s0228g0228/article/details/45368155 Git remote -v 查看现有远程仓库的地址url 三种方式都可以. 1. 修改 ...

  10. JAVAScript中DOM与BOM的差异分析

    JAVAScript 有三部分构成,ECMAScript,DOM和BOM,根据浏览器的不同,具体的表现形式也不尽相同.我们今天来谈一谈DOM和BOM这俩者之间的差异. 用百科上的来说: 1. DOM是 ...