最近在解决问题的时候不得不使用线程,从而接触到了STA和MTA,度娘给的解释大多语焉不详。在WikiPedia上面看到了比较清楚的描述,趁着能访问的间隙麻利的摘抄下来分享和自我提升。

单元类型 描述
单线程单元STA ), (ThreadingModel= Apartment ) 只用单个线程执行对象的方法。在这样的安排中,来自单元外线程的方法调用被系统 编组 并自动排队(通过标准的 Windows 消息队列)。因此,COM 运行时提供自动同步以确保对象的每个方法调用始终在调用另一个方法之前执行完成。因此,开发人员无需担心线程锁定或竞争条件。
多线程单元MTA ), (ThreadingModel= Free ) COM 运行时不提供同步,并且允许多个线程同时调用 COM 对象。因此,COM 对象需要执行自己的同步,以防止多个线程同时访问导致竞争条件。从 STA 中的线程对 MTA 对象的调用也被编组。
动态确定的单元(ThreadingModel= Both 在 两个单元 模式下,服务器在对象创建时自动选择 STA 或 MTA 以匹配调用线程的单元类型。 当 STA 线程访问 MTA 服务器时,这对于避免编组开销很有用。
线程中性单元NA ),(ThreadingModel= Neutral ) 一个没有任何分配线程的特殊公寓。当 STA 或 MTA 线程在同一进程中调用 NA 对象时,调用线程会暂时离开其单元并直接在 NA 中执行代码,无需任何线程切换。因此,人们可以将 NA 视为对高效跨部门方法调用的优化。

大意就是单线程单元访问外部是串行的,在前一个任务完全结束之前不会进行下一个任务(an object is always executed to completion before another is invoked),开发者一般情况下可以不用担心竞争和死锁等问题(The developer therefore does not need to worry about thread locking or race conditions.)。

线程模式分为STA(Single Threaded Apartment) 单线程单元 和 MTA 多线程单元(Multi-Threaded Apartment)。任何一个WPF程序,Main方法前必须有一个[STAThread]特性,否则编译会失败。这个特性用来申明该应用程序的初始线程模型为STA,以便和COM兼容。STA是.NET之前,旧的COM年代的词汇。

1.介绍

STA线程单元的运行方式称为Object-per-Client模式,就是在COM库初始化的时候创建一个内存结构,然后让它和调用CoInitialize的线程相关联。这个内存结构针对每个线程都会有一个。支持STA的COM对象只能在创建它的线程里被使用,其它线程如果再创建它就会失败。在STA线程模式中,对线程的所有调用都放到一个队列中,然后逐个处理这些调用。因此,STA线程永远不会同时执行多个方法。STA线程有自己的专有数据,它们不会在线程之间共享数据。这种特征使这一线程模式非常安全,避免了数据的损坏和同步问题。

MTA多线程单元,COM库在进程中创建一个内存结构,这个内存结构在整个进程中只能有一个,然后让它和调用CoInitializeEx的线程相关联。支持MTA的COM对象可以在任意线程里被使用。多个针对它的调用都会被封装成为消息。COM运行时不提供同步,允许多个线程同时调用COM对象。因此,COM对象需要执行它们自己的同步,以防止来自多个线程的同步访问,产生竞争条件。

2.区别

在同一个单元中,单线程单元(STA)访问外部是串行的,在前一个任务完全结束之前不会进行下一个任务,而MTA单元则可以同时运行多个线程,并使用所有可用的共享数据,由于MTA模式支持同时执行多个线程,所以调用者应负责同步多个线程之间的全局数据。

其实STA和MTA是COM规定的一套线程模型,用于保障多线程情况下你的组件代码的同步。比如说有一个COM对象它内部有一个静态变量 gHello,那么这个对象无论生成多少实例对于gHello在内存中只能有一份,那么如果有两个不同的实例在两个线程里面同时去读写它,就有可能出错,所以就要就要有种机制进行同步保护,STA或者MTA就是这种机制。

什么是单线程单元(STA)什么是多线程单元(MTA)相关推荐

  1. Thread\Threading.Timer\Task中ShowDialog()方法报错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式”

    在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 出错环境: 1.在Thread线程中,调用Show ...

  2. 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

    在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的 Main 函数带有 STAThreadAttribute 标记. 只有将调试器附加到该进程才会引发此异常. 程序之前 ...

  3. 避免单线程单元 (STA) COM 组件

    默认情况下,ASP.NET 不允许任何 STA COM 组件在页面内运行.若要运行它们,必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中.这样就将执行用的线 ...

  4. 异常错误:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式

    最近做一个蛋疼的东西就是C#调用windows API 来操作一个摄像头,自动处理一些东西.要用到剪切板复制 粘贴功能,即 Clipboard.SetDataObject(filedic, true) ...

  5. C#异常解决:在调用OLE之前,必须将当前线程设置为单线程单单元(STA)模式。

    问题来源: 昨晚上在调试数据库大作业的时候,我在注册界面Register里点击"上传头像"这个linklabel时,程序出现了一个异常:在调用OLE之前,必须将当前线程设置为单线程 ...

  6. 线程sta模式_C# 设置为单线程单元(STA)模式

    这个问题:在可以调用OLE之前,必须将当前线程设置为单线程单元(STA)模式.请确保您的Main函数带有STAThreadAttribute标记然后网上搜的解决方法:ThreadnewThread;p ...

  7. excel之根据单元格内容自动修改单元格颜色

    本单元分为2部分,以下面的excel为例 1.根据单元格内容修改本单元格颜色 我需要当工程师名称改变的时候,工程师名字的单元格背景色根据工程师的名称发生改变,那么可以这么实现: 1)选中要改变的单元格 ...

  8. 单元格内多个姓名拆分成一列_excel单元格拆分拆分同一单元格中的姓名,原来这么简单啊!...

    excel单元格拆分拆分同一单元格中的姓名,原来这么简单啊!,这个问题是我们很多人都很困惑的一个问题,excel单元格拆分是我们非常常用的一个东西,也是我们工作和学习中必不可少的一个数据公式,那么具体 ...

  9. 根据条件单元格的值改变单元格的显示色块和文字颜色等属性。

    #region 设置单元格样式(设置背景色)/// <summary>/// 设置单元格样式(设置背景色)/// </summary>/// <param name=&q ...

最新文章

  1. C语言高级编程:利用堆栈溢出修改函数返回地址
  2. rlwrap解决sqlplus上下键和backspace键找历史命令
  3. deno mysql_从 Node 到 Deno
  4. Java——集合经典面试题
  5. php ajax.open的 url路径,php – 检测Ajax调用URL
  6. android 触摸事件 控制,Android笔记:触摸事件的分析与总结----TouchEvent处理机制
  7. jQuery特效 | 导航底部横线跟随鼠标缓动
  8. iPhone文件系统:创建、重命名以及删除文件
  9. Linux云用户,Linux 用户与权限
  10. 运维基础知识总结(环境搭建篇)
  11. hill密码(希尔密码)
  12. Day 05 模板层相关
  13. sox处理mp3_音频处理利器--SoX
  14. uniapp封装request请求简洁明了(使用Promise封装)
  15. 小程序 : js获取今日日期、加日期、减日期; 判断今日 、判断昨日
  16. MacBook Pro 入手一年了,到底香不香?
  17. 蓝桥杯练习 数的读法
  18. 关于open_cursors和session_cached_cursors的参数值
  19. godaddy plesk mysql_» Godaddy的Plesk面板语言更改图文详细教程
  20. C#串口通讯+BigEndian+Little-Endian(大端和小端方案)

热门文章

  1. Git中创建一个新的分支并推送
  2. WPS文档协作的局域网搭建协作平台
  3. 【Arduino 和 DS3231 实时时钟教程】
  4. 深圳云计算培训:文件属性 chattr
  5. 青龙,XDD-plus,若兰,安装
  6. 平衡串联超级电容器的策略
  7. 公众号裂变涨粉技巧,快速实现拉新~
  8. 电子沙盘系统android,电子沙盘指挥系统功能介绍
  9. python自动抓取网管软件的数据_python实现scrapy爬虫每天定时抓取数据的示例代码...
  10. 机器人机械臂运动学——运动学正向解算