Parallel.For/ForEach是数据层面的并行,本文所讲的Task是将不同的操作并行执行,本文主要内容:

  1. Task的工作模型
  2. 初始化Task
  3. 完成Task
  4. 取消Task

一、Task工作模型

.Net中Task的工作模式是Fork/Join或者Master/Worker模式。核心思想是Master负责接受Client的请求,并且负责将请求分配给最终的Wroker,Worker执行完自己的工作后分别返回给Master。由Master汇总最终的结果并且返回给Client。

在.Net的Task并行编程中。一个Worker代表一个Task。

二、初始化Task

2.1Parallel.Invoke

Parallel.Invoke是最简单的办法Task并行编程模式。

2.2 TaskFactory.StartNew

该方法会创建一个Task用于执行作为参数的方法。

    class TaskDemo
{
public void Action1()
{
Console.WriteLine("in action1");
} public void Action2()
{
Console.WriteLine("in action2");
} public void StartTasks()
{
var task1 = Task.Factory.StartNew(Action1);
var task2 = Task.Factory.StartNew(Action2);
Task.WaitAll(task1, task2);
}
}

以上代码使用TaskFactory.StartNew方法创建了两个Task。task1用于执行Action1,task2用于执行Action2.

StartNew只是创建了一个task,并将该task加入到一个工作队列(work queue),当时该Task并没有马上执行,task什么时候执行是由TaskScheduler决定。TaskScheduler会将需要执行的task从中拿出来,然后才开始执行。(以上代码使用的是默认TaskScheduler)

TaskScheduler很可能马上执行,也有可能在未来的某一个特定时间点进行执行,取决于调度算法,以及CPU资源等。

三、Task的完成

刚开始说了。Task编程使用的是Master/Worker模式,该模式中最后一点是Worker最终会将结果返回给Master。由Master统一将结果进行汇总。在Task编程中有两个方法:

  1. Task.WaitAll。等待所有的Task(worker)完成。
  2. Task.WaitAny,等待任何一个Task完成即可。

3.1 Task.WaitAll

上面2.2的代码中已经使用了WaitAll,该方法将会等待两个Action完成之后才会进行返回,将上面的方法做一点改变。

class TaskDemo
{
public void Action1()
{
Thread.Sleep();
Console.WriteLine("in action1");
} public void Action2()
{
Thread.Sleep();
Console.WriteLine("in action2");
} public void StartTasks()
{
var task1 = Task.Factory.StartNew(Action1);
var task2 = Task.Factory.StartNew(Action2);
Task.WaitAll(task1, task2);
Console.WriteLine("Finished");
}
}

WaitAll之后再打印出”Finished“,按照WaitAll的定义,Finished永远是最后打印出来的字符串。

3.2 Task.WaitAny

将上面代码的WaitAll修改成WaitAny

       public void StartTasks()
{
var task1 = Task.Factory.StartNew(Action1);
var task2 = Task.Factory.StartNew(Action2);
Task.WaitAny(task1, task2);
Console.WriteLine("Finished");
}

最终运行结果:

可以看出使用了WaitAny后,没有等待Task2执行完毕,程序就回到了主线程,先打印出了Finished。

四、取消Task

4.1 取消流程

Task取消使用一个叫做coorperative cancellation的模型进行Task取消。主要使用CancellationTokenSource完成。该对象有一个CancellactionToken。当StartNew一个Task时候,可以将toker传给被创建的task。当CancellationTokenSource调用Cancel后,Task对应的Token状态将会变为取消(Canceled),Task的状态也会变为取消。这时候如果Task还没有启动,Task将不会再执行任务。

当然最后在每个Task内部也对Token进行判断,如果token已经取消,则不再执行当前Action(有些task可能在CancellactionToke被取消之前已经启动了),修改一下执行图:

4.2 演示代码

   class TaskDemo
{
public void Action1(CancellationTokenSource cts)
{
if(cts.IsCancellationRequested)
{
return;
}
Console.WriteLine("in action1");
} public void Action2(CancellationTokenSource cts)
{
Thread.Sleep();
if (cts.IsCancellationRequested)
{
Console.WriteLine("action2 is canceled");
return;
}
Console.WriteLine("in action2");
} public void StartTasks()
{
CancellationTokenSource cts = new CancellationTokenSource();
var task1 = Task.Factory.StartNew(() => Action1(cts), cts.Token);
var task2 = Task.Factory.StartNew(() => Action2(cts), cts.Token);
Task.WaitAny(task1, task2);
cts.Cancel();
Console.WriteLine("Finished");
}
}

4.3 运行结果

上面的运行结果有可能“action2 is canceled"这句话不会打印出来,因为有可能在Task2执行之前cts已经取消了。会进入流程图中第一个If判断点==》Not will run task

Parallel Programming-Task Base的更多相关文章

  1. Task Cancellation: Parallel Programming

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

  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. Samples for Parallel Programming with the .NET Framework

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

  4. 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 ...

  5. 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 ...

  6. A Pattern Language for Parallel Programming

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

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

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

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

    Parallel Programming for FPGAs 学习笔记(1)

  9. Parallel Programming AND Asynchronous Programming

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

  10. 多线程Parallel和Task

    不管是Parallel还是Task,最里面都是线程池(里面是线程)当开启多个任务后,系统会根据当前的线程池的资源进行分配,任务则进行等待Parallel可以对系统的CPU进行设置,可以最大程度上榨干系 ...

随机推荐

  1. Convex combination

    en.wikipedia.org/wiki/Convex_combination 凸组合 In convex geometry, a convex combination is a linear co ...

  2. 【译】Java语言速览:StackOverflow

    Java (请不要与 JavaScript 搞混) 是一种设计为与 Java 虚拟机 (JVM) 一起使用的多用途编程语言.一般称呼安装了相关工具使其可以开发并运行 Java 程序的电脑系统为 &qu ...

  3. VMware下所有的系统网卡启动不起来

    昨天新装了一台Linux,装好之后网络起不来,搞了半天也没弄好,总是报错: Failed to start LSB: Bring up/down networking.... 我以为是我的设置出了问题 ...

  4. vim 光标的移动和跳转文件的位置

    刚启动vim进入的就是命令模式 在命令模式下 h等于左箭头 j等于下箭头 k等于上箭头 l等于右箭头 想要多次移动可以使用30j或30↓向下移动30行 在命令模式下输入0跳到行头 在命令模式下输入$跳 ...

  5. NSAttributedStringKey

    NSFontAttributeName; //字体,value是UIFont对象 NSParagraphStyleAttributeName;//绘图的风格(居中,换行模式,间距等诸多风格),valu ...

  6. Storm,Spark和Samza

    http://www.csdn.net/article/2015-03-09/2824135 Apache Storm 在Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topolo ...

  7. vue双向绑定补充说明方法

    本文总结自: https://segmentfault.com/a/1190000006599500,将每一个流程提炼出来做一个简单的说明,以免自己被繁杂的逻辑弄昏头脑~ observer: 遍历数据 ...

  8. AJAX请求时status返回状态明细表

    AJAX请求时status返回状态明细表 readyState的五种状态2010-03-04 18:24对于readyState的五种状态的描述或者说定义,很多Ajax书(英文原版)中大都语焉不详 在 ...

  9. linux通过脚本获取内存信息

    1 原理 脚本中通过执行free获取内存信息,然后将文本信息通过“空格”分隔符分割成字符串数组将不同信息提取出来,最后通过bc计算出百分比 2 脚本 #!/bin/shHOSTNAME=`hostna ...

  10. windows下Scrapy爬虫框架环境搭建

    1.   安装python 根据你的需求下载python安装包,安装python(本文基于python27)https://www.python.org/downloads/ 下载完安装默认安装路径, ...