首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BackgroundWorker + WebBrowser

BackgroundWorker + WebBrowser
EN

Stack Overflow用户
提问于 2010-12-29 03:22:15
回答 3查看 2.9K关注 0票数 0

我试着用后台工作人员和网络浏览器浏览几个网页。我正在使用这个函数,但它不起作用。我不确定这里出了什么问题。

我只看到了MessageBox.Show(arr);其他什么也看不到。too浏览器也不会改变

代码语言:javascript
运行
复制
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" };
    for (int i = 0; i < 3; i++)
    {
        MessageBox.Show(arr[i]);
        bB_checker.Invoke((EventHandler)delegate { bB_checker.Navigate(arr[i]); });
        while (bB_checker.ReadyState != WebBrowserReadyState.Complete)
        {
            //  System.Threading.Thread.Sleep(100);
            Application.DoEvents();
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-29 03:58:45

在未检查RunWorkerCompleted事件处理程序中的e.Error属性的情况下,切勿实现BGW:

代码语言:javascript
运行
复制
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        if (e.Error != null) MessageBox.Show(e.Error.ToString());
    }

这个有点神秘的无效强制转换异常是由在工作线程上使用ReadyState属性引起的。WebBrowser不是线程安全。查看this answer,了解在工作线程上创建WB的方法。

但是,如果您需要保持浏览器对用户可见,则这不是一个好方法。在这种情况下,您将不得不放弃使用线程。这不是什么真正的问题,只需在DocumentCompleted事件处理程序中对数组索引进行计数即可。尽管闪现这些网页的意义不大。

票数 4
EN

Stack Overflow用户

发布于 2010-12-29 03:42:01

不能从WebBrowser控件的UI线程外部访问该控件的属性。请记住,属性是幕后的方法,因此这与您必须使用Invoke来调用导航的原因相同。

Application.DoEvents()不是必须的(我甚至不确定是否可以工作),因为后台工作线程运行在与UI线程不同的线程上。

此外,不是轮询WebBrowser的状态,而是使用DocumentCompleted事件来获取异步通知:

代码语言:javascript
运行
复制
 int i = 0;
 string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" };

 protected override void OnShown(EventArgs e)
 {
     base.OnShown(e);
     bB_checker.DocumentCompleted += bB_checker_DocumentCompleted;
     bB_checker.Navigate(arr[0]);
 }

 void bB_checker_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
 {
     i++;
     if (i < arr.Length)
        bB_checker.Navigate(arr[i]);
 }
票数 1
EN

Stack Overflow用户

发布于 2010-12-29 03:46:21

确保我将AllowNavigation属性设置为True。请参阅http://dotnetpulse.blogspot.com/2006/07/why-wont-webbrowser-navigate.html

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

https://stackoverflow.com/questions/4548786

复制
相关文章

相似问题

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