C# Winforms:一个COM对象需要一个STAThread,另一个需要一个MTAThread。我如何使用它们?

C# Winforms:一个COM对象需要一个STAThread,另一个需要一个MTAThread。我如何使用它们?,c#,winforms,com,mta,apartment-state,C#,Winforms,Com,Mta,Apartment State,我正在尝试用两个COM组件构建一个Winforms应用程序。但是,其中一个组件仅在使用[MTAThread]时起作用,而另一个组件仅在使用[STAThread]时起作用 推荐的解决方案是什么?Windows窗体要求[StatThread]出现在其主入口点上。它只能在单线程单元状态下工作。您可以在Windows窗体的UI线程上使用STA COM对象,而不会出现任何问题 典型的方法是创建自己的线程,并将设置为MTA,尽管这是单独线程的默认设置。在此线程中初始化并使用MTA线程化COM组件 Threa

我正在尝试用两个COM组件构建一个Winforms应用程序。但是,其中一个组件仅在使用[MTAThread]时起作用,而另一个组件仅在使用[STAThread]时起作用


推荐的解决方案是什么?

Windows窗体要求[StatThread]出现在其主入口点上。它只能在单线程单元状态下工作。您可以在Windows窗体的UI线程上使用STA COM对象,而不会出现任何问题

典型的方法是创建自己的线程,并将设置为MTA,尽管这是单独线程的默认设置。在此线程中初始化并使用MTA线程化COM组件

ThreadStart threadEntryPoint = ...;

var thread = new Thread(threadEntryPoint);
thread.ApartmentState = ApartmentState.MTA;  // set this before you call Start()!
thread.Start();

新线程=>{COMObject=new COMObject;…etc}。开始?是的。通常情况下,我不会将lambda用于新线程,只是因为thread方法往往较长,但这很好。。。。新线程默认为MTA,因此您可以对MTA线程执行此操作。它不能在GUI线程上,因为Windows窗体需要STA。我已经用线程尝试过了,但仍然不起作用。尽管如此,我的winform似乎工作正常。还有什么想法吗?@hb:Reed不是在开玩笑。不要将主gui线程放入MTA。生活会爆炸的。@里德:我希望你不介意我在你的答案中添加了一个简短的代码示例。应在线程启动之前设置ApartmentThread。我想我应该在你的回答中加上这一点。