1.5.4 Windows Runtime的线程模型
1.线程模型
· Windows Runtime与COM的线程模型相同,基于Apartments。
· 非GUI对象是MTA的,而GUI对象是STA的。
· STA在程序启动时创建,STA运行所有的UI代码以及负责传递消息,不允许重入。
1)STA
一个对象只能由一个线程访问(通过对象的接口指针调用其方法),其他线程不得访问这个对象,因此对于这个对象的所有调用都是同步的,对象的状态(也就是对象的成员变量的值)肯定是正确变化的,不会出现线程访问冲突而导致对象状态错误。其他线程要访问这个对象,必须等待,直到那个唯一的线程空闲时才能调用对象。这个模型很像Windows提供的窗口消息运行机制,因此这个线程模型非常适合于拥有界面的组件。
2)MTA
一个对象可以被多个线程访问,即这个对象的代码在自己的方法中实现了线程保护,保证可以正确改变自己的状态。这对于作为业务逻辑组件或用于后台服务的组件非常适合。因为作为一个分布式的服务器,同一时间可能有几千条服务请求到达,如果排队进行调用,那么将是不能想像的。
注意:这也只是一个要求、希望、协议而已。
3)Apartment
被翻译成套间或是单元,是线程模型的一个实现者,就像在操作系统课程中讲到的线程只是一个数学模型,而Windows的线程、进程是它(数学模型的线程、进程)的实现者。套间只是逻辑上的一个概念,实现时只是一个结构(由WinRT管理)而已,记录相关信息,如它的种类(只能是上面那三个,至少现在是),并由WinRT根据那个结构进行相应的处理。
2.异步模型
异步方法旨在成为非阻塞操作。当等待的任务运行时,在异步方法的一个等待表达式不会阻止当前线程。相反,该表达式注册该方法的其余部分作为继续并返回控制对异步方法的调用方法。
Windows Runtime中的异步方法都是以Async结尾的,并且返回IAsyncOperation<T>。在调用时通过await关键字等待异步方法执行。异步方法运行在后台线程里,在后台线程里不能访问UI的元素,当任务完成时如果需要将结果封送返回给UI线程,可以用CoreDispatcher类实现,否则会报跨线程操作的异常。