Как создать и использовать WebBrowser в фоновом потоке? - PullRequest
0 голосов
/ 27 декабря 2011

Как я могу создать System.Windows.Forms.WebBrowser в фоновом потоке STA?Я пытаюсь использовать некоторый код, подобный следующему:

var tr = new Thread(wbThread);
tr.SetApartmentState(ApartmentState.STA);
tr.Start();

private void wbThread()
{
     CWebBrowser browser = new CWebBrowser();
     var text = browser.Navigate("http://site.com", CWebBrowser.EventType.loadCompleted).Body.InnerHtml;
}

CWebBrowser - пользовательский класс, которому делегируется объект System.Windows.Forms.WebBrowser. Перейдите к методу Navigate и дождитесь завершения загрузки страницы.Проблема в том, что событие LoadCompleted для объекта System.Windows.Forms.WebBrowser никогда не возникает.Я нашел какое-то решение здесь , но оно не работает (не могу найти метод Application.Run () в моем приложении WPF).

public class CWebBrowser : ContentControl
{
    public readonly System.Windows.Forms.WebBrowser innerWebBrowser;
    private readonly AutoResetEvent loadCompletedEvent;
    private readonly AutoResetEvent navigatedEvent;

    public enum EventType
    {
        navigated, loadCompleted
    }

    public CWebBrowser()
    {
        innerWebBrowser = new System.Windows.Forms.WebBrowser();
        loadCompletedEvent = new AutoResetEvent(false);
        navigatedEvent = new AutoResetEvent(false);

        System.Windows.Forms.Integration.WindowsFormsHost host = new System.Windows.Forms.Integration.WindowsFormsHost();
        host.Child = innerWebBrowser;
        Content = host;

        innerWebBrowser.DocumentCompleted +=new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(innerWebBrowser_DocumentCompleted);
        innerWebBrowser.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(innerWebBrowser_Navigated);
    }

    void innerWebBrowser_Navigated(object sender, System.Windows.Forms.WebBrowserNavigatedEventArgs e)
    {
        navigatedEvent.Set();
    }

    void innerWebBrowser_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
    {
        if (((sender as System.Windows.Forms.WebBrowser).ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) || innerWebBrowser.IsBusy)
            return;

        var doc = innerWebBrowser.Document;
        loadCompletedEvent.Set();
    }

    public System.Windows.Forms.HtmlDocument Navigate(string url, EventType etype)
    {
        if (etype == EventType.loadCompleted)
            loadCompletedEvent.Reset();
        else if (etype == EventType.navigated)
            navigatedEvent.Reset();

        innerWebBrowser.Navigate(url);

        if (etype == EventType.loadCompleted)
            loadCompletedEvent.WaitOne();
        else if (etype == EventType.navigated)
            navigatedEvent.WaitOne();

        System.Windows.Forms.HtmlDocument doc = null;
        Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background, new Action(
            delegate
            {
                doc = innerWebBrowser.Document;
            }));

        return doc;
    }
}

Спасибо за все советы и извините замой плохой английский: o (

1 Ответ

0 голосов
/ 27 декабря 2011

Почему бы вам не использовать стандартный элемент управления WebBrowser, как этот?

public MainPage()
{
    InitializeComponent();

    System.Windows.Deployment.Current.Dispatcher.BeginInvoke(startNavigate);
}

void startNavigate()
{
    WebBrowser wb = new WebBrowser();
    wb.LoadCompleted += new LoadCompletedEventHandler(wb_LoadCompleted);
    wb.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(wb_Navigated);
    wb.Navigate(new Uri("http://www.google.com"));
}

void wb_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    // e.Content
}

void wb_LoadCompleted(object sender, NavigationEventArgs e)
{
    // e.Content when the document finished loading.
}

Редактировать: вы используете старый System.Windows.Forms.WebBrowser элемент управления вместо System.Windows.Controls.WebBrowser, который является частью WPF.

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