我如何使用async
代表与WatIn合作?我试过,但它返回了这个错误:
CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer。
我假设您在代表身上使用BeginInvoke()
。他们使用线程池进行线程工作,线程池中的线程都是MTA。你必须通过创建自己的Thread
以旧时尚的方式来做。线程类提供了改变公寓模型的方法(GetApartmentState
和SetApartmentState
)。
我想你可能需要你自己的消息泵在你的thread
。
这样的事情可能会让你开始:
var th = new Thread(() => { /* do work */ });
th.SetApartmentState(ApartmentState.STA);
th.Start();
由于IE COM互操作的工作性质,它本身就需要在单线程单元中运行。以下内容是从subject1的[watin.org]页面复制而来的
为什么首先需要设置ApartmentState?
从MSDN复制:
“因为COM类使用公寓,所以公共语言运行库需要在COM互操作情况下调用COM对象时创建和初始化公寓。托管线程可以创建并进入仅允许一个线程的单线程单元(STA),或者包含一个或多个线程的多线程单元(MTA)。“
由于Internet Explorer不是线程安全的,我们需要使用STA。
启示
将[STAThread]属性应用于main方法(应用程序的唯一入口点)时,使用WatiN在控制台或GUI应用程序中正常工作。这样主线程作为STA运行,一切顺利。当使用MBUnit,NUnit或任何其他启动主线程的跑步者时,您的代码/测试取决于跑步者开始使用的ApartmentState。
线程不是STA线程时WatiN的行为。
当您创建WatiN.Core.IE类的实例时,WatiN将抛出ThreadStateException,以帮助您提醒将ApartmentState设置为STA。