您的位置:首页 > 编程语言

.NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始

2011-10-15 19:51 381 查看
  前言:我们一步步的从简单的开始讲述,还是沿用我一直的方式:慢慢演化,步步为营。 本篇文章的议题如下:

  1.Task基础介绍

  2.Task的创建

  3.获取Task的执行结果

  4. 补充细节

  1.Task基础介绍

  首先我们还是来看看一段简单的代码:

  这里展示的只是一段简单的代码,不能显示出并行编程的特点。但是我们还是从最基本的开始看,慢慢进入深一点的话题。 如果你曾经用过.NET 中的多线程编程,比较一下,就会发现:这段代码虽然在底层还是使用了多线程,但是写法上却简化了很多,一行代码就实现了一个并行编程。

  下面我们就从Task类开始谈。 Task类是Task Programming Library(TPL)中最核心的一个类,下面我将会像大家展示如何使用一些方法来创建不同类型的Task,取消Task,等待Task执行完成,获取Task执行后的结果和对异常进行处理。 在开始讨论之前,我们首先快速的看看之前的代码: 这个命名空间将会是我们之后在讲述并行编程经常使用的一个。这个空间包含了很多与并行编程有关的类。

  还有一个要你使用的命名空间是:System.Threading,大家对这个应该比较熟悉了,之前的多线程编程常常使用到,这个空间下包含了一些在并行编程中用来协调数据的一些类。 上面代码中,最主要的代码如下:

Task.Factory.StartNew(()={Console.WriteLine("HelloWorld");});

  我们用静态方法:Task.Factory.StartNew()来创建了一个最简单的Task--在屏幕上打印一句话。这段代码确实简单,而且都没有任何输入和需要返回的结果。 下面我们就正式进入议题:

  2.Task的创建

   如果只是创建一个简单的Task,我们只要为该Task提供一个执行体就行了,执行体可以是一个委托delegate或者action。我们之前展示的那段代码就是采用了lambda表达式来作为Task的执行体。

  2.1 创建一个简单的Task

  为了执行一个简单的Task,一般进行以下步骤: 首先,要创建一个Task类的实例, 然后,传入一个System.Action委托,这个委托中的方法就是这个Task运行时你要执行的方法,而且这个委托必须作为Task构造函数的一个参数传入。我们在传入委托作为参数的时候有多种方式:传入匿名委托,Lambda表达式或者一个显示什么方法的委托。 最后,调用Task实例的Start()方法来运行。 当这个Task实例开始运行的时候,它就被传给了内部的一个task scheduler,这个scheduler负责把我们创建的task交给底下的线程去执行。 下面就看看代码:

代码

staticvoidMain(string[]args){//createthetaskTask上海闵行企业网站设计与制作pan style="color: #0000ff;">inttask1=Task.Factory.StartNewint(()={intsum=0;for(int上海企业网站设计与制作e="color: #000000;">i=0;i100;i++){sum+=i;}returnsum;});//writeouttheresultConsole.WriteLine("Result1:{0}",task1.Result);Console.ReadLine();}

  4. 补充细节

  在创建Task的时候,Task有很多的构造函数的重载,一个主要的重载就是传入TaskCreateOptions的枚举: TaskCreateOptions.None:用默认的方式创建一个Task TaskCreateOptions.PreferFairness:请求scheduler尽量公平的执行Task(后续文章会将是,Task和线程一样,有优先级的) TaskCreateOptions.LongRunning:声明Task将会长时间的运行。 TaskCreateOptions.AttachToParent:因为Task是可以嵌套的,所以这个枚举就是把一个子task附加到一个父task中。

  最后要提到的一点就是,我们可以在Task的执行体中用Task.CurrentId来返回Task的唯一表示ID(int)。如果在Task执行体外使用这个属性就会得到null。 (熟悉WF的朋友,可以比较Task和WF的一些区别,因为我认为它们的设计思想很相近) 今天就到这里了,多谢大家!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: