Использование элемента управления WebBrowser в библиотеке классов - PullRequest
1 голос
/ 22 октября 2011

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

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.");
    }
}

1 Ответ

2 голосов
/ 22 октября 2011

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

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

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