c#:不能访问已处置的对象.对象名称:WebBrowser'

本文关键字:对象 WebBrowser 访问 不能 | 更新日期: 2023-09-27 18:15:11

你好,我正在使用我的web浏览器,我一直得到以下错误:无法访问处置的对象。对象名称:'WebBrowser'.

我想用我的代码做的是循环通过列表框中的每个项目,访问一个页面,使一个消息框说成功弹出,然后向下移动到下一个项目。发生的事情是,它只对前两个项目说"成功",然后它停止了对第三个项目的工作,当我关闭我的程序时,我得到上面列出的错误/警告。

这是我的代码:

listBox3.SelectedIndex = 0;
for (int i = 0; i < listBox3.Items.Count; i++)
{
     completed();
     move();
}
这是完成的()的代码:
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)
{
     ....

c#:不能访问已处置的对象.对象名称:WebBrowser'

您尝试访问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周期,什么都不做。更好的解决方案可能是处理WebBrowserDocumentCompleted事件。

这是因为导航永远不会在第三个项目上完成,所以您被困在循环中。当您关闭表单时,循环仍在进行,但在某些时候,.net清理表单,并且您的webbrowser1元素不再有效。

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

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

2)如果表单关闭,跳出循环(你可以添加一个表单级别的属性,在表单中设置。结束语或表格。