- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
.NET4.0 并行计算技术基础(8)
有些朋友来邮件询问本系列文章的示例源码,由于我没有发现 CSDN 博客直接提供了上传附件的功能,所以打算等本章所有文章贴完以后,再将所有源码打包上传到 CSDN 下载频道。
另外,要想看懂本系列文章,需要您对.NET 多线程开发有基本的了解。我在新书中花了近200 页的篇幅来介绍.NET 多线程开发技术,可帮助大家循序渐进地掌握技术,呵呵,在此先作个广告。
今天贴出第 8 讲 “任务的同步”,本章内容过半了。
金旭亮
2009.10.12
==================================
19.3.6 同步多个任务
在并行计算应用程序中,通常会创建多个 Task 对象以执行不同的工作任务, 而依据具体应用场景,这些工作任务对象之间又会有着相互协作的需求,比如可能要求某个工作任务完成以后自动启动一个或多个新的 Task 对象执行后继处 理工作,或者某个正在执行的工作任务中途需要等待另一个工作任务执行完毕才能执行,这就是任务的同步问题。
Task 类提供了 ContinueWith 和 Wait 系列方法,在“任务”的层次(而不是线程的层次)实现任务的同步。
1 使用 ContinueWith
例如,以下代码在 task1 完成之后自动运行 task2:
Task task1=new Task(()=
{
DoStep1();
});
Task task2 = task1.ContinueWith ((PrevTask) =
{
DoStep2();
});
task1.Start();
上述代码中的 PrevTask 参数代表已完成的“前辈” Task 对象, TPL 会将此对象传给后继的 Task 对象,因此,在后继对象中可以通过此参数获取前一个任务的相关信息。
ContinueWith() 方法有多个重载形式,其中很有用的是返回一个
TaskTResult 的重载形式:
public TaskTResult ContinueWithTResult( FuncTask, TaskTResult continuationFunction);
当任务需要返回一个唯一值时,可以使用这个重载形式。
有的 ContinueWith() 方法重载形式接收一个 TaskContinuationOptions 类型的参数:
public Task ContinueWith( ActionTask continuationAction,
TaskContinuationOptions continuationOptions );
TaskContinuationOptions 是一个枚举,可以使用它来指定“在何种情况下” 才执行后继的工作任务。例如,以下代码指定只有 task1 中有未捕获的异常时, 才运行 task2 :
Task task2 = task1.ContinueWith((PrevTask) =
{
DoWithException();
2 使用
2 使用 Wait 系列方法
另一个被广泛使用的任务同步手段是 Task 类的 Wait 系列方法,此系列方
法可分为 3 类,每类方法又有着多个重载形式。
1.
Wait(): 等待单个任务的完成
WaitAll(): 等待一组任务的全部完成
WaitAny() :等待一组任务的任何一个任务完成
当并行程序调用上述方法时,会在调用线程上阻塞等待任务完成。以下代码等待单个任务的完成:
Task t = Task.Create(...);
...
t.Wait();
以下代码等待多个任务的完成:
Task
t1
=
Task.Create(...);
Task
t2
=
Task.Create(...);
Task
t3
=
Task.Create(...);
...
Task.WaitAll(t1, t2, t3);
将上述代码中的 WaitAll 改为 WaitAny ,则 t1,t2,t3 中任何一个完成时, 当前任务都会结束等待状态而继续执行。
3 创建父子类型的任务
当一个任务会创建另一个任务时,称此任务为“父任务”,被创建的为“子任务”。使用任务之间的“父子关系”,可以实现类似于 Task.ContinueWith 的功能:
Task tskParent = new Task(() =
{
父//任务完成的工作
创//建后继子任务并自动启动
Task.Factory.StartNew(()
=
MethodA());
Task.Factory.StartNew(()
=
MethodB());
Task.Factory.StartNew(()
=
MethodC());
/启/
});
动父任务
5 小结
5 小结
文档评论(0)