C #: невозможно получить доступ к удаленному объекту. Имя объекта: «WebBrowser» - PullRequest
1 голос
/ 21 ноября 2011

Здравствуйте. Я работаю с веб-браузером и получаю следующую ошибку: Не удается получить доступ к удаленному объекту. Имя объекта: «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!");
    }
}

Это код для перемещения ():

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 ]

1 голос
/ 21 ноября 2011

Это потому, что навигация по третьему элементу никогда не завершается, поэтому вы застряли в своем цикле. Когда вы закрываете форму, цикл все еще продолжается, но в какой-то момент .net очищает форму, и ваш элемент webbrowser1 больше не действителен.

Итак, вам нужно ввести дополнительный код для:

1) По истечении заданного промежутка времени (1 минута) вырваться из цикла и указать на сбой.

2) Если форма закрывается, вырвитесь из цикла (вы можете добавить свойство уровня формы, заданное в событии Form.Closing или Form.Closed, и, если это так, выйти из цикла) .

1 голос
/ 21 ноября 2011

Вы пытаетесь получить доступ к 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!");
    }
}

Кроме того, я не могу сказать наверняка, поскольку у меня нет всего кода, но ... цикл там очень неэффективен. Это будет загружать циклы процессора, ничего не делая. Лучшим решением может быть обработка события WebBrowser DocumentCompleted.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...