我在课堂上使用watin,我在后台工作者Do Work中调用该类,但在第一行它会抛出异常
The CurrentThread needs to have it's ApartmentState set to ApartmentState.STA to be able to automate Internet Explorer.
我该怎么办?
在stackoverflow的一个线程中有一个类似的讨论,但他的问题是通过加入线程等问题解决的。
答案 0 :(得分:3)
.NET的祖父,做了.NET不做的事情。您可以编写使用List<>的.NET程序。在一个线程中,如果你没有正确锁定,没有诊断就会失败。但是COM知道COM组件的线程要求。如果组件说它不是线程安全的,那么你不能忽视它。这是错误消息的含义,它只能用于'单线程单元',STA。 STA线程具有自动编组从组件线程到创建组件的线程的组件调用的管道。与Control.Invoke()非常相似,但是自动完成。
这限制了您以多线程方式严重使用它的选项。除了在GUI应用程序的UI线程上运行之外,您可以做的唯一其他事情是创建一个STA线程,您可以在其中创建IE和watin实例。 This answer告诉你如何。请注意,BackgroundWorker无法执行此操作,其DoWork方法始终在MTA线程上运行。链接代码的关键部分是Thread.SetApartmentState,用于将线程切换到STA,以及由Application.Run()启动的消息循环。两者都需要让这些COM组件正常运行。
答案 1 :(得分:1)
后台工作程序使用ThreadPool中的线程,我相信MTA是默认的。您应该创建一个新的Thread实例并在其上调用SetApartmentState(STA)。