.Net4.0 Parallel编程(四)Task 上

  在之前的文章中,已经介绍过了Parallel Loop(上、中、下)的相关内容。本篇文章中会就Task基础部分进行些介绍。

  初识Task

  首先我们来构建一个简单的Task的Demo:

static void Main(string[] args)

{

Task.
Factory.StartNew(() =>

{

Console.WriteLine("Hello word!");

});

Console.Read();

}

  在上面这段代码中我们构建出了一段非常简单的使用Task类的代码,通过其Factory属性的创建出一个Task。其运行结果可想而知。其实上面的代码跟:

static void Main(string[] args)

{

Task task = new Task(() =>

{

Console.WriteLine("Hello,Word!");

});

task.Start();

Console.Read();

}

  是一样的,只是StartNew方法直接构建出了一个Task之后又调用了其Start方法。在Task内部执行的内容我们称作为Task的Body,Task提供了多个初始化重载的方法。我们来看下面一个示例:

static void Main(string[] args)

{

Task task1 = new Task(() =>

{

Console.WriteLine("Message: Say \"Hello\" from task1");

});

Task task2 = new Task(new Action<object>(printMessage),

"Say \"Hello\" from task2");

Task task3 = new Task((obj) => { printMessage(obj); },

"Say \"Hello\" from task3");

Task task4 = new Task((obj) => {
Console.WriteLine("Message: {0}", obj); },

"Say \"Hello\" from task4");

task1.Start();

task2.Start();

task3.Start();

task4.Start();

Console.Read();

}

  上面的例子中使用了重载方法的State参数,其运行结果:

  好像结果跟我们想象的优点不太一样,其实我们仔细想想就可以理解了。

  返回值static void Main(string[] args)

{

var loop = 0;

var task1 = new Task<int>(() =>

{

for (var i = 0; i < 1000; i++)

loop += i;

return loop;

});

task1.Start();

var loopResut = task1.Result;

var task2 = new Task<long>(obj=>

{

long res = 0;

var looptimes = (int)obj;

for (var i = 0; i < looptimes; i++)

res += i;

return res;

},loopResut);

task2.Start();

var resultTask2 = task2.Result;

Console.WriteLine("Task1's result:{0}\nTask2's result:{1}",

loopResut,

resultTask2);

Console.ReadKey();

}

  运行的结果:

  在这里要说的是,Result属性的获取是在一个Task运行完成才会获取的,所以上面的task2是在task1运行完成后,才开始运行,也就是说上面的两个result的值不管运行多少次都是不会变的。其中我们也可以通过CurrentId来获取当前运行的Task的编号,但是要注意的一点,如果我们再Task的body之外获取他将会返回null。

  总结

  在这篇文章中我们看到了如何创建一个Task,以及使用其返回值的属性的介绍。下篇文中我们会看下如何取消一个Task。

时间: 2024-09-20 13:41:21

.Net4.0 Parallel编程(四)Task 上的相关文章

一起谈.NET技术,.Net4.0 Parallel编程(四)Task 上

在之前的文章中,已经介绍过了Parallel Loop(上.中.下)的相关内容.本篇文章中会就Task基础部分进行些介绍. 初识Task 首先我们来构建一个简单的Task的Demo: static void Main(string[] args){ Task.Factory.StartNew(() => { Console.WriteLine("Hello word!"); }); Console.Read();} 在上面这段代码中我们构建出了一段非常简单的使用Task类的代码,

一起谈.NET技术,.Net4.0 Parallel编程(二)Data Parallelism 中

在上篇文章中看过了使用Parrallel.For.Parael.Foreach在效率上给我们带来的提高.本文就来如何终止循环.线程局部变量 进行说明. Thread-Local Variables 首先我们来看下线程局部变量,是的我们也许一直在想我们如何去定义一个线程局部变量呢.先看段顺序执行的代码: [TestMethod()]public void NormalSequenceTest(){int[] nums = Enumerable.Range(0, 1000000).ToArray()

.Net4.0 Parallel编程(二)Data Parallelism 中

在上篇文章中看过了使用Parrallel.For.Parael.Foreach在效率上给我们带来的提高.本文就来如何终止循环.线程局部变量 进行说明. Thread-Local Variables 首先我们来看下线程局部变量,是的我们也许一直在想我们如何去定义一个线程局部变量呢.先看段顺序执行的代码: [TestMethod()] public void NormalSequenceTest() { int[] nums = Enumerable.Range(0, 1000000).ToArra

.Net4.0 Parallel编程(一)Data Parallelism 上

Parallel.For 首先先写一个普通的循环: private void NormalFor() { for (var i = 0; i < 10000; i++) { for (var j = 0; j < 1000; j++) { for (var k = 0; k < 100; k++) { DoSomething(); } } } } 再看一个并行的For语句: private void ParallelFor() { Parallel.For(0, 10000, i =&g

一起谈.NET技术,.Net4.0 Parallel编程(一)Data Parallelism 上

Parallel.For 首先先写一个普通的循环: private void NormalFor(){for (var i = 0; i < 10000; i++) {for (var j = 0; j < 1000; j++) {for (var k = 0; k < 100; k++) { DoSomething(); } } }} 再看一个并行的For语句: private void ParallelFor(){ Parallel.For(0, 10000, i => {fo

.Net4.0 Parallel编程(三)Data Parallelism 下

在上篇文章中介绍了如何Break.Stop循环,以及如何定义线程局部变量.在本文中介绍如何在外部去取消循环.以及异常的处理. Cancel 在并行的循环中支持通过传递ParallelOptions参数中的CancellationToken进行取消循环的控制,我们可以CancellationTokenSource实例化之后传递给ParallelOptions对象Cancellation值.下面来看个示例: [TestMethod] public void CancelLoop() { var so

一起谈.NET技术,.Net4.0 Parallel编程(三)Data Parallelism 下

在上篇文章中介绍了如何Break.Stop循环,以及如何定义线程局部变量.在本文中介绍如何在外部去取消循环.以及异常的处理. Cancel 在并行的循环中支持通过传递ParallelOptions参数中的CancellationToken进行取消循环的控制,我们可以CancellationTokenSource实例化之后传递给ParallelOptions对象Cancellation值.下面来看个示例: [TestMethod]public void CancelLoop(){ var sour

vs2012 sp net-VS2012打开项目 提示Asp.net4.0未在web服务器上注册

问题描述 VS2012打开项目 提示Asp.net4.0未在web服务器上注册 如上图 请问这个问题怎么解决 解决方案 运行下aspnet_regiis.exehttps://msdn.microsoft.com/zh-cn/library/k6h9cz8h(VS.80).aspx 解决方案二: http://www.cnblogs.com/lvxiouzi/p/3511446.html

.Net 4.0 Parallel 编程(五)Task (中)

在上篇文章中我们看过了如何创建Task,本篇文章就各种类型Task的使用进行说明. Task Continuations 首先我们来看看延续的Task,所谓的延续的Task就是在第一个Task完成后自动启动下一个Task.我们通过ContinueWith方法来创建延续的Task.我们假设有一个接受xml解析的服务,首先从某个地方接受文件,然后解析入库,最后返回回执是否解析正确: [TestMethod] public void TaskParallelPrint() { var ReceiveT