【发布时间】:2010-12-04 01:21:09
【问题描述】:
我正在尝试使用两个 COM 组件构建一个 Winforms 应用程序。但是,其中一个组件仅在使用 [MTAThread] 时有效,而另一个仅在 [STAThread] 时有效。
推荐的解决方案是什么?
【问题讨论】:
标签: c# winforms com mta apartment-state
我正在尝试使用两个 COM 组件构建一个 Winforms 应用程序。但是,其中一个组件仅在使用 [MTAThread] 时有效,而另一个仅在 [STAThread] 时有效。
推荐的解决方案是什么?
【问题讨论】:
标签: c# winforms com mta apartment-state
Windows 表单要求 [STAThread] 出现在其主入口点上。它只能在单线程单元状态下工作。您可以在 Windows 窗体的 UI 线程上使用您的 STA COM 对象,没有任何问题。
对此的典型方法是创建您自己的线程,并将Thread.ApartmentState 设置为单独线程的 MTA(尽管这是默认设置)。在该线程中初始化和使用您的 MTA 线程 COM 组件。
ThreadStart threadEntryPoint = ...;
var thread = new Thread(threadEntryPoint);
thread.ApartmentState = ApartmentState.MTA; // set this before you call Start()!
thread.Start();
【讨论】:
ApartmentThread 应该在线程启动之前设置。我想我会将这一点添加到您的答案中。