NET 4.0 System.Threading.Tasks学习笔记
由于工作上的需要,学习使用了System.Threading.Tasks的使用,特此笔记下来。
System.Threading.Tasks的作用:
Tasks命名空间下的类试图使用任务的概念来解决线程处理的复杂问题。任务(Task)包含一个操作,以及依赖哪个任务的完成才能开始。
测试用例:
假设有任务A,B,C,D。其中C依赖A和B的完成,而D依赖A的完成。代码该怎么写呢?
代码:
?
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->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()));
?
?
测试任务类:
?
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->?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”同时”执行的现象