您好我正在使用我的网络浏览器并且我一直收到以下错误:无法访问已处置的对象。 对象名称:'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)
{
....
答案 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事件中设置的表单级属性,如果这是真的,则跳出循环)