由于工作上的需要,学习使用了System.Threading.Tasks的使用,特此笔记下来。
System.Threading.Tasks的作用:
Tasks命名空间下的类试图使用任务的概念来解决线程处理的复杂问题。任务(Task)包含一个操作,以及依赖哪个任务的完成才能开始。
测试用例:
假设有任务A,B,C,D。其中C依赖A和B的完成,而D依赖A的完成。代码该怎么写呢?
代码:
1
TaskFactory factory
=
new
TaskFactory();
2
Task a
=
factory.StartNew((
new
TestAction(
"
A
"
,
2
)).Do);
3
Task b
=
factory.StartNew((
new
TestAction(
"
B
"
,
5
)).Do);
4
Task c
=
factory.ContinueWhenAll(
new
Task[] { a, b }, ((preTasks)
=>
(
new
TestAction(
"
C
"
,
1
)).Do()));
5
Task d
=
factory.ContinueWhenAll(
new
Task[] { a }, ((preTasks)
=>
(
new
TestAction(
"
D
"
,
1
)).Do()));
测试任务类:
1
public
class
TestAction
2
{
3
public
TestAction(
string
actionName,
int
p)
4
{
5
_actionName
=
actionName;
6
_p
=
p;
7
}
8
9
private
int
_p;
10
private
string
_actionName;
11
public
void
Do()
12
{
13
Console.WriteLine(
"
开始执行
"
+
_actionName);
14
Thread.Sleep(
new
TimeSpan(
0
,
0
, _p));
15
Console.WriteLine(
"
执行完毕
"
+
_actionName);
16
}
17
}
需要注意的是,StartNew方法将立即执行,并不会等待后续的任务加入后才开始,这个是让我刚开始学习时很困惑的。而且StartNew方法不是一个同步方法,这意味着将立即执行后面的语句,因此,我们也就模拟出了任务A和B”同时”执行的现象