BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

使用Task、Continuation和Future来代替ThreadPool

| 作者 Jonathan Allen 关注 615 他的粉丝 ,译者 赵劼 关注 5 他的粉丝 发布于 2009年2月7日. 估计阅读时间: 4 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点
.NET 4.0中提供一个新版的线程池(thread pool)。除了性能改善和新的负载均衡功能之外,新的线程池还允许您使用Task。一个Task是一个轻量的工作单元,类似您使用ThreadPool.QueueUserWorkItem方法创建的工作项。但是和匿名的工作项不同,Task对象提供了强大的API。您可以捕获Task.StartNew方法返回的对象,以此来使用这些API。这个方法和Thread类似,接受一个定义了工作内容的委托对象或匿名方法。
 
与线程对象的完整功能类似,Task对象释放出一些方法,可以让线程等待任务完成。这些方法是Wait,WaitAny和WaitAll,后两个方法可以接受一系列的任务。您可以选择无限期的等待,或在一段时间之后超时。
 
等待期间,调用Wait方法的线程会被阻塞。如果阻塞并不符合您的要求,您可以使用Continuation。这里所说的Continuation是指安排在一个或多个任务完毕之后执行的操作。您可以提供一个委托,并使用ContinueWith,ContinueWithAll或ContinueWithAny三个方法来创建这种后置的任务。您可以多次调用这些方法以创建一系列的操作。
 
Cancellation是.NET目前无法良好支持的一个方面。现在没有很好的办法从线程池中删除不需要的任务,而且线程的取消是一件非常危险的事情。在.NET 4.0中,任务的取消成为了核心功能。如果一个任务还没有开始就被取消,那么它会立即从队列中移除。如果这个任务已经开始了,那么还需要一个操作来配合进行。实际执行任务的委托需要定期检查IsCancellationRequested属性,并给出有效的答复。
 
任务还有另一个以前的.NET所没有的功能,它支持“父子”关系。这允许一个复杂的任务被分割为几个小部分,但是还是被视为单个逻辑操作。这点为任务取消等操作提供了巨大的便利。当一个父任务被取消时,您可以选择让所有的子任务同时被取消。
 
Future是一个异步执行某个方法的任务。在需要得到方法的结果时,Future对象会检查这个方法是否完成了。方法执行完毕后这个结果会被返回,至于没有执行完毕的情况下就要根据实现来决定了。
 
例如,读取Future对象的Value属性会导致线程被阻塞至方法执行完毕。与其他任务相似,您也可以访问IsCompleted属性,或者调用Wait,ContinueWith和Cancel方法。这些新功能使.NET中的Future对象比书本上描述的更加强大,甚至已经不仅仅是一个原来设想的Future对象了。正是因为如此,.NET 4.0的Future已经被重新命名为Task<T>,其中T为返回值的类型。
 
值得一提的是,.NET中的Task并不强制为线程安全的操作。这里没有做过任何保护,例如在一个计算导数的Future对象中也可以改变全局变量。这意味着普通锁和对象拥有规则依旧是生效的。不过您可以尽可能地避免这种状况,只需独占地使用不可变对象即可。
 
有关Task的更多信息,你可以参考Daniel Moths的“新Task类型的介绍”以及Stephen Toub的“ContinueWith所带来的有用抽象”。
 

查看英文原文:Replacing the ThreadPool with Tasks, Continuations, and Futures

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT