当前位置: 首页 > 编程语言 > C#

与MTA线程相比,STA线程有什么局限性?分享

时间:2023-04-10 18:16:02 C#

STA线程与MTA线程相比有哪些局限性?如果我们像这样创建一个线程STA:Thread.SetApartmentState(STA);那么它就不能运行标有[MTAThread]属性的代码。我们在Windows和控制台应用程序中看到[STAThread],但我从未见过具有[MTAThread]属性的代码,也不知道哪些.NET库使用了此属性。我的问题是,与具有MTA单元状态的线程(自然是.NET线程)相比,单元状态设置为STA的线程有哪些限制?然后它无法运行标有[MTAThread]属性的代码。它不是这样工作的。单元类型是线程的属性,而不是方法。您会看到[STAThread]属性仅应用于.NET程序的Main()方法。它确定为运行程序而创建的第一个线程的单元类型。必要的,因为线程运行后无法调用SetApartmentState()。除此之外,该属性没有任何意义,线程在其生命周期内保留在STA中。您永远不会看到[MTAThread],因为这是默认设置。STA线程有一些限制。它从不阻塞,因为它阻塞并经常死锁任何试图调用单元线程COM对象方法的代码。而且它必须泵出一个消息循环,以便COM可以编组来自另一个线程的方法调用。编组方法调用只能在线程“空闲”时执行,而不是忙于执行任何代码。消息循环提供“不忙”状态。COM组件也有要求。它必须支持编组,或者通过将自身限制为自动化支持的类型子集,以便可以使用标准编组器。或者通过为自定义编组提供代理/存根对。HKCRInterface{iid}ProxyStubClsid32注册表项确定封送处理的完成方式。明确支持在STA和MTA线程之间共享单元线程对象。STA线程必须创建它,并且对MTA线程(或其他STA线程)的任何调用都被封送。这确保组件只能看到在同一线程上进行的调用,从而确保线程安全。不需要额外的锁定。最后但同样重要的是,如果您在MTA线程上创建一个单元线程COM对象,那么COM将自动创建一个STA线程,给它一个安全的家。唯一的失败模式是COM组件不支持编组。这样做的一个缺点是每个调用都将被编组。那很慢。如果您不使用COM,我认为这没有任何区别。如果这样做,那么在某些情况下,COM对象可能只能从一种或另一种类型的线程访问。如果COM对象在两个单元中都有效,则尝试性能测试。或者阅读MSDN上的COM公寓。但我认为这对性能无关紧要,这是一种设计选择或其他东西。以上是C#学习教程:STA线程与MTA线程相比有什么局限性?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: