来自STAThread上的MSDN文章:
指示应用程序的COM线程模型是单线程单元(STA)。
(作为参考,请参阅the entire article。)
单线公寓。好吧,我没想到这一点。此外,我在某处读到,除非您的应用程序使用COM互操作,否则该属性实际上什么也不做。那么它到底做了什么,又是如何影响多线程应用程序的呢?多线程应用程序(包括任何使用Timer
的人到异步方法调用,而不仅仅是线程池等)是否应该使用MTAThread,即使它“只是为了安全”?STAThread和MTAThread实际上是做什么的?
发布于 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可以优化这些不同对象之间的调用,从而避免在不必要的情况下进行封送处理。
发布于 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.
发布于 2012-03-21 21:48:23
STAThread是在C#图形用户界面项目的主函数之前编写的。它什么也不做,只是允许程序创建单个线程。
https://stackoverflow.com/questions/165316
复制相似问题