Использование элемента управления WebBrowser в библиотеке классов

Я пытаюсь использовать этот элемент управления в библиотеке классов, но когда я запускаю приведенный ниже код, я не вижу отправки запроса в Google (с использованием скрипача).

public class WebBrowserTest
{
    public WebBrowserTest()
    {
        var t = new Thread(StartBrowser);
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }

    private void StartBrowser()
    {
        WebBrowser web;
        web = new WebBrowser();
        web.Navigate("http://www.google.com");
    }
}

Я предполагаю, что это как-то связано с многопоточностью и, возможно, с тем, что поток заканчивается до того, как элемент управления получает возможность отправить запрос. Но я понятия не имею, с чего начать решение этой проблемы.

РЕШЕНИЕ

Я обнаружил, что это решение работает, события запускаются, и основной поток ожидает потока STA.

public class WebThread
{
    private WebBrowser web { get; set; }

    public void StartBrowser()
    {
        web = new WebBrowser();
        web.Visible = true;
        web.DocumentCompleted += Web_DocumentCompleted;
        web.ScriptErrorsSuppressed = true;
        web.Navigate("http://www.google.com");

        Application.Run();

        web.Dispose();
    }

    private void Web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        Debug.Print("Arrived: " + e.Url.ToString());

        if (e.Url.ToString() == "http://www.google.com.au/")
        {
            Application.ExitThread();
        }
    }
}


public class WebBrowserTest
{
    public WebBrowserTest()
    {
        Debug.Print("Thread is starting.");
        var webThread = new WebThread();

        var t = new Thread(webThread.StartBrowser);
        t.SetApartmentState(ApartmentState.STA);
        t.Start();

        while(t.IsAlive)
        {
            Thread.Sleep(5000);
        }

        Debug.Print("Thread has finished.");
    }
}

person g.foley    schedule 22.10.2011    source источник
comment
Подумайте о том, что происходит с переменной web, когда поток заканчивается.   -  person user957902    schedule 22.10.2011
comment
Элементы управления пользовательского интерфейса возможны только в основном потоке переднего плана; Я не уверен, как он ведет себя, когда вы создаете его в фоновом потоке.   -  person Uwe Keim    schedule 22.10.2011
comment
возможный дубликат C# WebBrowser Control в новом потоке   -  person Hans Passant    schedule 22.10.2011
comment
Обратите внимание на небольшую проблему с кодом: мы начинаем навигацию на google.com, но затем перенаправление отправляет нас в локальную службу Google. В случае OP это предположительно был www.google.com.au, но в вашем случае это может быть другой URL-адрес (например, google.co.il/?...), и код просто зависнет, так как поток никогда не завершится.   -  person Dror    schedule 28.03.2014


Ответы (1)


WebBrowser.Navigate( ... ) не блокирует - возвращает сразу, до отправки запроса. Поскольку ваша функция потока затем завершается, весь ваш поток заканчивается и берет с собой ваш WebBrowser контроль.

Если вы просто пытаетесь загрузить веб-страницу, взгляните на Веб-клиент класс. Он имеет множество асинхронных методов, что означает, что вам, вероятно, даже не придется создавать собственный поток.

person Nick Butler    schedule 22.10.2011
comment
WebClient в этом случае не работает, так как мне нужно выполнить javascript. Но ваш ответ был правильным. Я добавил свое решение ниже. - person g.foley; 23.10.2011