【Windows8开发】异步编程进阶篇之 对thread说不,用task

时间:2021-08-25 19:00:56
之前的文章中曾经简单描述过WinRT异步编程的一些入门知识和浅显的实例,鉴于WinRT中异步的应用相当广泛,本系列中会更深入的介绍C++异步编程的一些细节和难点,希望能带给大家更多实质性的收获。之前异步编程入门篇的一些文章链接如下:

看到本文标题,大家也许以为我疯了,程序怎么能离开thread呢?先解释一下,这里所谓的对thread说不,是指对传统的thread API的使用方式说不。凭什么呢?因为WinRT提供了更好的API----Concurrency::task(虽然本质上还是基于线程)。
(申明下,本文并不是否定使用thread,因为说到底还是线程的那套机制,只是在特定平台下推荐一些更好的API选择。如果需要考虑跨平台的话,那又是另一回事了,微软貌似从来不会考虑跨平台的东东,目前看来WinRT发布后,想跨平台追加支持Metro的各种库的开发者有得忙了)

先让我们来回想一下过往thread使用的辉煌历史吧。
曾几何时,你为如何安全的主动终止一个thread而苦恼过吗?
曾几何时,你为thread中异常未捕获而导致程序崩溃而沮丧过吗?
曾几何时,你为多个线程间的按序执行和协调绞尽脑汁过吗?
曾几何时,你为要实现只能在主线程中更新UI而不知所措过吗?
微软的那些大牛们似乎也是考虑到以上来自thread使用中的种种不便,终于下定决心要在WinRT中有所改变。看过我之前讲API整合那篇博客的应该知道,WinRT中已经不再支持以前windows中一系列thread相关的API了,而且从Metro App的种种特性来看,对开发者来说需要更强大,更完善,更安全的异步处理机制的支持。首先,在WinRT中引入了Thread Pool以及基于Thread Pool的Timer(ThreadPoolTimer),它是支持异步,支持优先级,并且有些方面非常类似我们即将介绍的task,但至少目前为止并没有十分充分的理由让我去选择使用ThreadPool,因为task已经足够强大,足够满足开发中的各种需求。

ok,task现在开始闪亮登场!
作为异步编程进阶篇的第一篇文章,本文不会详细去介绍task的特性,因为涉及内容还确实不少,不是一篇文章或短时间内就可以写完介绍完的。因此,先让我们概要性的了解一些task的特性,在异步编程进阶篇的后续文章中,会逐一详细说明。
前面把task吹的神乎其神,那它到底有哪些特性呢?归纳如下:

1. 通过Lambda表达式,让task的创建执行都异常简单(create_task,create_async)
2. 便捷安全的异常处理机制
3. 安全易用的线程停止取消机制(cancellation_token)
4. 及其简单的多任务(线程)间执行序列控制机制(then,task-based,value-based)
5. 方便地任务执行上下文控制机制(task_continuation_context)
6. 任务组执行控制协调机制 (task_group,structured_task_group,parallel_for)
7. 想到再加......

是不是听得云里雾里的,太多概念性的泛泛而谈确实不利于理解,搞技术的还是跟喜欢来写代码什么的示例对吧?抱歉,本文中,这个真没有,但后续文章中这个可以有,呵呵。放心,后续文章中会一项项抽出来跟大家详细介绍的,异步编程是开发Metro程序必不可少的方面,而task是我们进行异步编程的第一选择,相信随着内容深入,你必将被它吸引。
如何玩转task,且听下回一一分解。
注:本异步编程进阶篇系列以C++异步编程为主进行说明,C#,javascript概念类似,根据情况酌情加减。