【发布时间】:2014-01-24 12:04:39
【问题描述】:
我刚刚开始处理 STA/MTA 问题,因此对于问题的简单性表示歉意。我在这里的阶梯底部找不到我能真正理解的答案。
我正在为另一个软件编写一个插件,并且在工作线程中遇到了我需要创建一些 UI 元素的点。我知道我不能从工作线程内部执行此操作,因为它不是 STA 线程,并且我需要返回主(或只是另一个?)STA 线程来创建 UI 元素。一些澄清会很有帮助。
是否所有 STA 线程都具有相同的“权限”,即如果主线程是 STA 并创建一个窗口,则向其添加一些 UI 元素。然后产生另一个 STA 线程,第二个线程同样创建一些 UI 元素,它们是否在同一个“空间”中执行(糟糕的词选择,但我不知道还能使用什么)并且可以访问彼此的 UI 元素不会造成死亡和破坏?或者我是否需要显式跳回主/原始 STA 线程并且只从那个(而不仅仅是任何)STA 线程创建 UI 元素?
如果是这种情况(只允许 1 个 STA 线程制作 UI 元素),我该如何正确地做到这一点?我看过很多与此相关的帖子,但由于某种原因,我不太了解发生了什么,并且希望得到一个真正简单的答案。
请不要'这是一种很酷的巧妙方法......'我只需要在执行点的简单方法,如果有必要,我需要一些 UI 元素跳回主 STA 线程。
如果没有必要,那我就让那个工作线程成为 STA 线程并继续我的方式,这样公平吗?还是我在招惹灾难?
【问题讨论】:
-
STA 和 MTA 是与 COM 编程相关的术语。你真的在做COM吗?如果不是,那么只需关注保持 UI 线程安全的需要,并使用您用来编组调用的类库提供的基本原语。 Winforms 中的 Control.Begin/Invoke()、WPF 中的 Dispatcher.Begin/Invoke() 或 Store 应用程序。
-
这是我得到的错误:System.InvalidOperationException:调用线程必须是 STA,因为许多 UI 组件都需要这个。因此,我认为这是一个 STA/MTA 问题。我没有明确地使用任何 COM(据我所知),但我正在为一个(很多)更大的软件编写插件,我知道它正在使用 COM。
-
您应该更多地了解您正在为其编写插件的“更大”软件的架构。一些应用程序具有多线程 UI,其中每个主 UI 窗口都存在于自己的线程中。仅举几例:MS Word、Windows 资源管理器。您的主机应用程序会出现这种情况吗?
标签: c# .net multithreading sta mta