WatIn 多线程

发布于 2024-10-29 05:23:26 字数 180 浏览 0 评论 0原文

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

CurrentThread 需要将其 ApartmentState 设置为 ApartmentState.STA 能够自动化 Internet Explorer。

How can I work with WatIn using async delegates? I tried, but it returned this error:

The CurrentThread needs to have it's ApartmentState set to
ApartmentState.STA to be able to automate Internet Explorer.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

み零 2024-11-05 05:23:26

我假设您在委托上使用 BeginInvoke() 。他们使用线程池来做线程工作,线程池中的线程都是MTA的。您必须通过创建自己的线程以老式方式来完成此操作。线程类提供了方法(GetApartmentStateSetApartmentState)来更改公寓模型。

我想您可能还需要在您的线程中使用自己的消息泵。

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

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

I assume you use BeginInvoke() on your delegates. They use the thread pool to do threaded work and the threads in the thread pool are all MTA's. You will have to do it the old fashion way by creating your own Thread. The thread class offers methods (GetApartmentState and SetApartmentState) to change the apartment model.

I guess you might need your own message pump as well in your thread.

Something like this might get you started:

var th = new Thread(() => { /* do work */ });
th.SetApartmentState(ApartmentState.STA);
th.Start();
清泪尽 2024-11-05 05:23:26

由于 IE COM 互操作工作方式的本质,它本质上需要在单线程单元中运行。以下内容摘自 [watin.org] 页面上有关该主题的内容1

为什么首先需要设置 ApartmentState?

从 MSDN 复制:

“因为 COM 类使用单元,
公共语言运行时需要
创建并初始化公寓
当在 COM 中调用 COM 对象时
互操作情况。托管线程
可以创建并进入单线程
公寓(STA)只允许一间
线程,或多线程单元
(MTA) 包含一个或多个
线程。”。

由于 Internet Explorer 不是线程安全的,我们需要使用 STA。

影响

使用 WatiN 在控制台或
GUI 应用程序,当您应用
[STAThread] 属性到 main
方法(该方法的唯一入口点
应用)。这样主线程
作为 STA 运行,一切顺利。什么时候
使用 MBUnit、NUnit 等运行器或
启动主赛的任何其他赛跑者
线程,您的代码/测试取决于
跑步者开始的 ApartmentState
与。

当线程不是 STA 线程时 WatiN 的行为。

WatiN 会抛出一个
创建时出现ThreadStateException
WatiN.Core.IE 的一个实例
类,帮助您提醒设置
ApartmentState 到 STA。

Because of the nature of how the IE COM interop works, it inherently needs to be run in a single-threaded apartment. The following is copied from the [watin.org] page on the subject1

Why is setting the ApartmentState needed in the first place?

Copied from MSDN:

“Because COM classes use apartments,
the common language runtime needs to
create and initialize an apartment
when calling a COM object in a COM
interop situation. A managed thread
can create and enter a single-threaded
apartment (STA) that allows only one
thread, or a multithreaded apartment
(MTA) that contains one or more
threads.”.

Since Internet Explorer is not Thread safe we need to use STA.

Implications

Using WatiN works fine in a console or
GUI application when you apply the
[STAThread] attribute to the main
method (the sole entry point of the
application). This way the main Thread
runs as STA and all goes well. When
using a runner like MBUnit, NUnit or
any other runner that starts the main
Thread, your code/tests depend upon
the ApartmentState the runner started
with.

Behaviour of WatiN when Thread is not an STA Thread.

WatiN will throw a
ThreadStateException when you create
an instance of the WatiN.Core.IE
class, to help you remind to set the
ApartmentState to STA.

少女的英雄梦 2024-11-05 05:23:26

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

编辑

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

Use RequiresSTA attribute, starting with NUnit 2.5.

EDIT

Use Apartment attribute, starting with NUnit 3.0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文