我在一个类中使用了watin,我在后台worker中调用了该类,但在第一行抛出了异常
The CurrentThread needs to have it's ApartmentState set to ApartmentState.STA to be able to automate Internet Explorer.我能做什么?
在stackoverflow的一个线程中,也有类似这样的讨论,但他的问题通过连接线程之类的东西解决了。
发布于 2010-12-22 21:42:07
COM,.NET的鼻祖,做了.NET没有做的事情。您可以编写一个在线程中使用List<>的.NET程序,如果您没有正确地锁定它,它将在没有诊断的情况下严重失败。但是,COM知道COM组件的线程要求。如果组件说它不是线程安全的,那么你不能忽略这一点。这就是错误消息的意思,它只能在“单线程单元”STA中使用。STA线程具有自动将对组件进行的调用从工作线程编组到创建组件的线程的管道。非常类似于Control.Invoke(),但它是自动完成的。
这严重限制了您以多线程方式使用它的选择。除了让它在GUI应用程序的UI线程上运行之外,您唯一可以做的其他事情就是创建一个STA线程,您可以在其中创建IE和watin实例。This answer将向您展示如何操作。请注意,BackgroundWorker不能做到这一点,它的DoWork方法始终在MTA线程上运行。链接代码的关键部分是将线程切换到STA的Thread.SetApartmentState和由Application.Run()启动的消息循环。要让这些COM组件正常工作,这两个组件都是必需的。
发布于 2010-12-22 21:41:13
后台工作线程使用来自ThreadPool的线程,我相信这是默认的MTA。您应该创建一个新的Thread实例并在其上调用SetApartmentState(STA)。
https://stackoverflow.com/questions/4509577
复制相似问题