- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
.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 小结
您可能关注的文档
- 人教版小学二年级数学下册单元测试题全册.docx
- 人教版小学二年级下册语文《寓言二则》教学设计.docx
- 人教版小学二年级下册语文单元试卷全册.docx
- 溶解度曲线习题.docx
- 溶解度曲线专题练习.docx
- 软件工程导论课后习题答案.docx
- 软件行业客户满意度调查表模板.docx
- 软件开发方案和实施安排.docx
- 软件著作权-设计说明书范本.docx
- 三年级《科学家故事100个》考级题目.docx
- 2022年11月连江县直机关遴选公务员面试真题带答案详解.docx
- 2022年11月遵义市直遴选面试真题回忆版.docx
- 2022年2月伊春市税务系统遴选面试真题回忆版.docx
- 2022年11月朔州市税务系统遴选面试真题回忆版汇总.docx
- 2022年2月秦皇岛市税务系统遴选面试真题回忆版汇总.docx
- 2022年2月焦作市直机关遴选公务员面试真题附详解.docx
- 2022年11月黑龙江省直机关遴选公务员面试真题附详细解析.docx
- 2022年2月潍坊市直机关遴选公务员面试真题附解析.docx
- 2022年2月大同市直遴选面试真题附详解.docx
- 2022年2月巴音郭楞蒙古自治州直机关遴选公务员面试真题带题目详解.docx
文档评论(0)