STA

STA本身不是.NET平台的产物,它起原于1993年面世的COM(组件对象模型)的发布.
多么希望我是一个COM编程的高手,以至于将.NET中这个问题描述的更加透彻.
必境CLR的前身就是COM,当CLR还在被开发时,它有过的名字有COM+,COM3.

1 COM 线程模型
   COM线程本质就是win32线程,只不过重新定义了术语而已.
   对应于win32的UI线程的COM线程叫单线程套间,而非UI线程叫自由线程.
   每个STA都有一个隐藏的USER32窗口,并且具有消息循环机制用于处理windows消息事件.

2 .NET中为什么要引入STA?
   我并不知道真实的原因,但是我却知道一些.NET中需要STA机制理由,我想就是真正的原因.
   与COM互操作这个理由足够充分,ASP.NET Framework是从COM自然发展而来的,为了实现向后兼容,COM互操作允许对现有的COM组件进行访问而无需修改原始组件.
   由于COM类使用套间,因此CLR需要在COM互操作的情况下创建并初始化一个套间(STA/MTA).
   单线程套间中只能有一个线程在运行,这就是它名字的含义,所以COM组件就省掉了许多对象同步的烦脑.
   单线程套间中创建的组件,只能由创建它的那个线程访问,这非常类似于WIN FORMS编程中的UI组件的更新,必须由UI线程来处理(大多数开发者都用过Control.Invoke吧).
   在.NET类库中就有一些类,它们必须运行在STA模式中.例如:System.Windows.Forms.Clipboard, WebBrowser.

STA模式是指任何时刻只能有一个客户线程来访问该组件,不是说不能被多线程的客户端来调用!你使用多线程来访问STA对象的时候,请求会被串行化到一个windows消息队列中,队列中的请求逐个被执行,所以在编写STA组件时,程序员无需关心线程同步的问题

永远不要将任何 STA COM 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里。这类资源包括像缓存和会话状态这样的资源。即使 STA 线程调用 STA COM 组件,也只有构造此 STA COM 组件的线程能够实际为该调用服务,而这要求封送处理对创建者线程的调用。此封送处理可能产生重大的性能损失和可伸缩性问题。在这种情况下,请研究一下使 COM 组件成为 MTA COM 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。

你可能感兴趣的:(a)