C#:无法访问已处置的对象。对象名称:'WebBrowser'

时间:2011-11-20 20:07:35

标签: c# listbox browser

您好我正在使用我的网络浏览器并且我一直收到以下错误:无法访问已处置的对象。 对象名称:'WebBrowser'。

我正在尝试使用我的代码循环浏览列表框中的每个项目,访问页面,创建一个消息框说成功弹出窗口,然后向下移动到下一个项目。会发生什么事情只是说前两个项目的“成功”然后它停止了第三个工作,当我关闭我的程序时,我得到上面列出的错误/警告。

这是我的代码:

listBox3.SelectedIndex = 0;

for (int i = 0; i < listBox3.Items.Count; i++)
{
     completed();
     move();
}

这是completed()的代码:

webBrowser1.Navigate(listBox3.SelectedItem.ToString());

while (!(webBrowser1.ReadyState == WebBrowserReadyState.Complete))
{
    Application.DoEvents();

    if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        MessageBox.Show("Success!");
    }
}

这是move()的代码:

listBox3.SelectedIndex = +1;

webBrowser1.Navigate(listBox3.SelectedItem.ToString());

while (!(webBrowser1.ReadyState == WebBrowserReadyState.Complete))
{
    Application.DoEvents();

    if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
    {
        MessageBox.Show("Success!");
    }
}

我在这一行得到错误:

if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
     ....

2 个答案:

答案 0 :(得分:1)

您尝试访问webBrowser1,但由于表单不再需要它,因此已被处理掉。您可以通过检查webBrowser1.IsDisposed并在Application.DoEvents()之后退出循环来防止这种情况发生,如下所示:

webBrowser1.Navigate(listBox3.SelectedItem.ToString());

DateTime start = DateTime.Now;

while(webBrowser1.ReadyState != WebBrowserReadyState.Complete) {
    Application.DoEvents();

    if(webBrowser1.IsDisposed || DateTime.Now.Subtract(start).TotalSeconds > 10.0) break; // A time limit of 10 seconds, can be changed

    if(webBrowser1.ReadyState == WebBrowserReadyState.Complete) {
        MessageBox.Show("Success!");
    }
}

另外,我不能肯定地说因为我没有完整的代码,但是......循环效率非常低。它会占用CPU周期。更好的解决方案可能是处理WebBrowser的{​​{1}}事件。

答案 1 :(得分:1)

这是因为导航永远不会在第三个项目上完成,因此您会陷入循环中。当您关闭表单时,循环仍在继续,但在某些时候,.net会清除表单,并且您的webbrowser1元素不再有效。

因此,您需要引入一些额外的代码:

1)在指定的时间段(1分钟)后退出循环并指示失败。

2)如果表单关闭,则跳出循环(您可以添加在Form.Closing或Form.Closed事件中设置的表单级属性,如果这是真的,则跳出循环)