WatIn多线程

问题描述 投票:2回答:3

我如何使用async代表与WatIn合作?我试过,但它返回了这个错误:

CurrentThread需要将它的ApartmentState设置为ApartmentState.STA才能自动化Internet Explorer。

c# multithreading watin
3个回答
3
投票

我假设您在代表身上使用BeginInvoke()。他们使用线程池进行线程工作,线程池中的线程都是MTA。你必须通过创建自己的Thread以旧时尚的方式来做。线程类提供了改变公寓模型的方法(GetApartmentStateSetApartmentState)。

我想你可能需要你自己的消息泵在你的thread

这样的事情可能会让你开始:

var th = new Thread(() => { /* do work */ });
th.SetApartmentState(ApartmentState.STA);
th.Start();

1
投票

由于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。


1
投票

使用RequiresSTA属性,从NUnit 2.5开始。

编辑

使用Apartment属性,从NUnit 3.0开始。

© www.soinside.com 2019 - 2024. All rights reserved.