STA和MTA线程模式

前言:前几天在做机房重构的时候遇到了一个没有见过的错误,是一个关于线程的问题

在这里插入图片描述
经过跟度娘的一顿交流,虽然发现了解决办法,但是还是没有弄懂那个线程的问题
网上大神给的大致解决办法有两种
在这里插入图片描述
第一个就是在程序的主函数入口加上[STAThread]
(亲测有效)
第二个应该是在具体代码中使用,我没用出来,但是大神说的应该是可以解决问题的
虽然问题解决了也没明白这到底咋回事,但是还是去查了查

出现这个错误的原因主要是:

单元是进程内部具有相同线程访问要求的对象的逻辑容器。同一单元中的所有对象都可以接收从该单元中的任何线程发出的调用。.NET Framework 不使用单元,托管对象自己负责以线程安全的方式使用所有共享资源。由于 COM 类使用单元,因此公共语言运行库需要在 COM interop 的情况下调用
COM 对象时创建并初始化一个单元。托管线程可以创建并进入只允许有一个线程的单线程单元 (STA) 或者包含一个或多个线程的多线程单元 (MTA)。通
过将线程的 ApartmentState 属性设置为 ApartmentState 枚举值之一,可以控制所创建的单元的类型。由于给定线程只能初始化 COM 单元一次,因此在第一次调用非托管代码之后就不能更改单元类型。

那么什么是STA单线程,什么是MTA多线程呢?有什么区别呢

STAThread:Single Thread Apartment Thread.(单一线程单元线程),是一种线程模型,其它的还有MTA(多线程套间)、Free Thread(自由线程)。
STA线程单元的运方式称为每客户对象dao(Object-per-Client)模式,其含义是创建STA线程单元拥有它自己的线程。在任何一单元之内都只能有一个线程。在STA线程模式中,对线程的所有调用都放到一个队列中,然后逐个处理这些调用。因此,STA线程永远不会同时执行多个方法。STA线程有自己的专有数据,
它们不会在线程之间共享数据。这种特征使这一线程模式非常安全,避免了数据的损坏和同步问题。
STA和MTA线程单元的最大不同在于,在同一个单元中,MTA单元可以同时运行多个线程,并使用所有可用的共享数据。

希望对有同样需求的小伙伴有帮助
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值