gpt4 book ai didi

c# - Web 浏览器控件 : "Specified cast is not valid."

转载 作者:行者123 更新时间:2023-11-30 19:32:12 25 4
gpt4 key购买 nike

我使用 WebBrowser 控件导航到 WordPress 博客的登录页面。页面加载正常,但每当我尝试从线程访问 WebBrowser 时。我得到一个特定的 cast is not valid 异常。同样在调试时,一切都会卡住大约 5 秒。调试时,我尝试访问控件。我在所有成员变量上都遇到超时错误。

//in constructor of main form
Thread.CurrentThread.ApartmentState = ApartmentState.STA;
this.CheckForIllegalCrossThreadCalls = false;

mainThreadHandle = new Thread(mainThread);
mainThreadHandle.Start();

private void mainThread()
{
wbMain.Navigate("http://example.com/");

//navigating is set to false in the document complete event.
navigating = true;

while (navigating == true)
Thread.Sleep(5000);

try
{
//Where I get the issues
MessageBox.Show(wbMain.DocumentText);
}
catch (Exception e)
{

}

Thread.Sleep(1000);
}

最佳答案

WebBrowser 是底层的 COM 组件。作为一个线程单元,COM 负责以线程安全的方式调用其方法。由于这个原因,您的 Navigate() 调用有效,它实际上是在 UI 线程上执行的。不起作用的是 DocumentText 属性,它是在 .NET 包装器中实现的,他们在代码上有些笨拙。当 CLR 中的 COM 互操作支持注意到 MTA 中的线程试图访问位于 STA 上的组件的属性时,它就会爆炸。

您对 SetApartmentState() 的调用不正确。它是在错误的线程上创建的,UI 线程已经是 STA。也是它不爆炸的原因,你不能在线程启动后改变它的单元状态。您必须在您创建的 Thread 对象上调用它。还是没有解决你的问题,两个STA线程不兼容。

解决问题的两种基本方法。第一个是您在单独的 STA 线程上创建 WebBrowser 对象本身。 this answer中的代码向您展示如何做到这一点。

您以这种方式创建的浏览器也无法在您的表单上显示。这是第二种方法,使用 Control.Invoke() 自己编码调用。但是,这样做毫无意义,无论如何,您的所有代码都在 UI 线程上执行,您无法获得并发性。这里没有免费的午餐。在线程上运行它只会让你头疼。如果您需要时间来处理文档文本,请在单独的线程上运行代码。

关于c# - Web 浏览器控件 : "Specified cast is not valid.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5848839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com