首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >STAThread和多线程

STAThread和多线程
EN

Stack Overflow用户
提问于 2008-10-03 01:14:02
回答 3查看 82K关注 0票数 104

来自STAThread上的MSDN文章:

指示应用程序的COM线程模型是单线程单元(STA)。

(作为参考,请参阅the entire article。)

单线公寓。好吧,我没想到这一点。此外,我在某处读到,除非您的应用程序使用COM互操作,否则该属性实际上什么也不做。那么它到底做了什么,又是如何影响多线程应用程序的呢?多线程应用程序(包括任何使用Timer的人到异步方法调用,而不仅仅是线程池等)是否应该使用MTAThread,即使它“只是为了安全”?STAThread和MTAThread实际上是做什么的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-03 01:42:26

单元线程是一个COM概念;如果您没有使用COM,并且您调用的API都没有“在幕后”使用COM,那么您就不需要担心单元。

如果您确实需要注意公寓,那么细节可能会变得有点复杂(http://msdn.microsoft.com/en-us/library/ms693344(VS.85%29.aspx);一个可能过于简单的版本是,标记为STA的COM对象必须在STAThread上运行,而标记为MTA的COM对象必须在MTA线程上运行。使用这些规则,COM可以优化这些不同对象之间的调用,从而避免在不必要的情况下进行封送处理。

票数 61
EN

Stack Overflow用户

发布于 2008-10-03 01:38:33

这样做的目的是确保通过指定COINIT_APARTMENTTHREADED作为参数来调用CoInitialize。如果不使用任何COM组件或ActiveX控件,则对您没有任何影响。如果你这样做了,那么它就变得很关键了。

单元线程的控件实际上是单线程的,对它们的调用只能在创建它们的单元中处理。

来自MSDN的更多细节:

在单线程单元中创建的

对象仅从其单元的线程接收方法调用,因此调用是序列化的,并且仅到达消息队列边界(当调用Win32函数PeekMessage或SendMessage时)。

在多线程单元(MTA)中的COM线程上创建的对象必须能够随时接收来自其他线程的方法调用。通常使用Win32同步原语(如临界区、信号量或互斥锁)在多线程对象的代码中实现某种形式的并发控制,以帮助保护对象的数据。

当STA或MTA中的线程调用配置为在中立线程单元( NTA )中运行的对象时,该线程将转移到NTA。如果此线程随后调用CoInitializeEx,则调用将失败并返回RPC_E_CHANGED_MODE.

票数 3
EN

Stack Overflow用户

发布于 2012-03-21 21:48:23

STAThread是在C#图形用户界面项目的主函数之前编写的。它什么也不做,只是允许程序创建单个线程。

票数 -15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/165316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档