.Net 4.0 Parallel 编程(四) Task(上)
2010-10-18 22:27 by Henry Cui, 2150 visits, 收藏, 编辑在之前的文章中,已经介绍过了Parallel Loop(上、中、下)的相关内容。本篇文章中会就Task基础部分进行些介绍。
初识Task
首先我们来构建一个简单的Task的Demo:
1
2
3
4
5
6
7
8
|
static
void
Main(
string
[] args)
{
Task.Factory.StartNew(() =>
{
Console.WriteLine(
"Hello word!"
);
});
Console.Read();
}
|
在上面这段代码中我们构建出了一段非常简单的使用Task类的代码,通过其Factory属性的创建出一个Task。其运行结果可想而知。其实上面的代码跟:
1
2
3
4
5
6
7
8
9
|
static
void
Main(
string
[] args)
{
Task task =
new
Task(() =>
{
Console.WriteLine(
"Hello,Word!"
);
});
task.Start();
Console.Read();
}
|
是一样的,只是StartNew方法直接构建出了一个Task之后又调用了其Start方法。在Task内部执行的内容我们称作为Task的Body,Task提供了多个初始化重载的方法。我们来看下面一个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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参数,其运行结果:
好像结果跟我们想象的优点不太一样,其实我们仔细想想就可以理解了。
返回值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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。