【发布时间】:2014-08-11 17:14:03
【问题描述】:
当我尝试在 WinForm 中启动 OpenFileDialog 时,我最近在程序中遇到了与 STA 相关的错误。我已经阅读了一些内容,在将 [STAThread] 属性添加到我的主线程之前,我想知道它将如何影响我的程序的执行。
我是 COM 的外国人,所以并不是我读到的所有内容都对我有意义。让我印象深刻的几点是:
[STAThread] 属性将应用程序定义为使用单线程单元模型。 更具体地说,它将应用程序线程的状态更改为单线程。 http://www.a2zdotnet.com/View.aspx?Id=93
当一个对象被多个线程访问时,STA 体系结构可能会导致显着的性能损失。每个线程对对象的访问都是序列化的,因此每个线程必须排队等待轮到它处理对象。
http://www.codeproject.com/Articles/9190/Understanding-The-COM-Single-Threaded-Apartment-Pa
我了解线程安全的必要性,但我仍然不明白 STAThread 做了什么。在我的程序(我从另一个开发人员那里继承)中,主线程启动了其他几个线程,其中一个线程初始化了 UI 表单——我认为这就是问题所在。随着[STAThread] 添加了新线程会发生什么?这会影响非 Windows 对象的多线程通信吗?
当我尝试在我的一个表单中打开OpenFileDialog 时发生错误。我使用 VS 设计器将对话框添加到表单中:它不起作用。然后我尝试在由主线程运行的全局文件中创建一个对话框,并从我的表单中调用该实例。没有效果。
【问题讨论】:
-
This StackOverflow question 解释的很清楚。
-
@icemanind 我很惊讶当我输入自己的问题时,这不是一个建议的问题。这是一个很好的解释,但没有解释其他衍生线程会发生什么(如果有的话)。
-
@ChristopheD 我的错误消息是
Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process。我不明白为什么我无法从创建它的表单中调用该对话框。 -
该属性用于指示此线程是单单元线程。这用于 COM 互操作,某些控件需要它来提供其功能
标签: c# multithreading com sta