首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程状态异常

线程状态异常
EN

Stack Overflow用户
提问于 2010-12-22 21:21:22
回答 2查看 2.4K关注 0票数 2

我在一个类中使用了watin,我在后台worker中调用了该类,但在第一行抛出了异常

代码语言:javascript
复制
The CurrentThread needs to have it's ApartmentState set to ApartmentState.STA to be able to automate Internet Explorer.

我能做什么?

在stackoverflow的一个线程中,也有类似这样的讨论,但他的问题通过连接线程之类的东西解决了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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组件正常工作,这两个组件都是必需的。

票数 3
EN

Stack Overflow用户

发布于 2010-12-22 21:41:13

后台工作线程使用来自ThreadPool的线程,我相信这是默认的MTA。您应该创建一个新的Thread实例并在其上调用SetApartmentState(STA)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4509577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档