zoukankan      html  css  js  c++  java
  • 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 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。

  • 相关阅读:
    hibernate课程 初探单表映射2-7 hbm配置文件常用设置
    SQL partition (小组排序)
    修改input的text 通过jquery的html获取值 未变化
    ASP.NET MVC5使用Area区域
    MVC 缓存
    C# 后台访问webapi
    分布式系统
    滴滴出行技术总监:关于技术选型的那些事儿
    Json Self referencing loop detected
    VMWare 安装 Eclipse
  • 原文地址:https://www.cnblogs.com/smailxiaobai/p/2250775.html
Copyright © 2011-2022 走看看