来自其他线程的WebBrowser.DocumentText(读取Access)

时间:2014-06-10 17:00:30

标签: c# multithreading winforms

在我的主窗口(Form1)上有一个WebBrowser元素导航到某些目标。 (大部分时间都是从Threads调用的)

现在我需要从一个Thread中获取该WebBrowser的DocumentText。尝试这样做会导致异常:

  

发生了类型为“System.InvalidCastException”的未处理异常   在System.Windows.Forms.dll

异常出现在以下行中(在线程内):

String newContent = webBrowser1.DocumentText.ToString();

以相同的方式从主线程中访问DocumentText。

我无法在Thread内部创建WebBrowser元素,因为我需要停用各种脚本元素,然后我收到Excception:

"Window handle of control element "AxTriggerCtrl" could not read. 
"Windowless ActiveX-controls are not supported" 

我想使用WebBrowser而不是WebClient,因为它需要遵循各种(javascript)重定向,元刷新和Ajax加载的内容。

我可能可以创建一个包含Webbrowser的Form2,从线程调用它并使用它 - 但我希望还有另一个解决方案:)

有什么想法吗?


古斯曼是对的。使用委托解决了问题。

        public delegate String GetWebBrowserTextThread();
        public String GetWebBrowserText()
        {
            if (webBrowser1.InvokeRequired)
            {
                GetWebBrowserTextThread gwbtt = new GetWebBrowserTextThread(GetWebBrowserText);
                return (String)webBrowser1.Invoke(gwbtt);
            }
            else
            {
                return webBrowser1.DocumentText;
            }
        }

并从主题:

String newContent = cfg.ApplicationForm1.GetWebBrowserText(); //cfg is just a configuration singleton

在问之前应该尝试过 - 会节省一些时间和头痛:)

1 个答案:

答案 0 :(得分:1)

如果您使用的是桌面应用程序,请使用任何控件的Invoke函数在UI线程中执行一段代码,否则如果您使用的是WPF,则可以使用Dispatcher.Invoke执行相同操作。