4

現在開発中のアプリケーションにを使用することを選択した唯一の理由は、UI スレッドから離れた をBackgroundWorker介した時間のかかるブラウジングを移動することです。WebBrowser

しかしWebBrowser.Navigate()、UI にアクセスしていませんか?

言い換えれば、私はこのすべての努力を行ったにもかかわらず、同じ場所に着地するだけでした (さらに悪いことに、UI コントロールにアクセスするときに非 UI スレッドがどのような副作用をもたらすかわかりません)。

このようなものを実装したいと思ったのは私が初めてではないと確信しているので、私の質問は次のとおりです。この問題を解決するための許容可能な方法は何ですか? すなわちWebBrowser.Navigate()からへBackgroundWorker

4

1 に答える 1

4

Navigate()ブロッキング呼び出しではありませんが ( MSDN ドキュメントの最初の行を参照)、UI を更新するため、UI スレッドから呼び出す必要があります。

いくつかのオプションがあります。

  1. Navigate()呼び出しを介して、BackgroundWorker から UI スレッドへの呼び出しをInvokeマーシャリングします。
  2. BackgroundWorker を使用しないNavigate()でください。UI (ボタン クリック イベント ハンドラーなど) から呼び出しを行い、WebBrowser DocumentCompleted イベントをリッスンします。

1 の例については、https://stackoverflow.com/a/1862639/517244を参照してください。

2 のコード サンプルを次に示します。

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void _goButton_Click(object sender, EventArgs e)
    {
        _webBrowser.Navigate("http://google.com/");
        // Non-blocking call - method will return immediately
        // and page will load in background
    }

    private void _webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        // Navigation complete, we can now process the document
        string html = _webBrowser.Document.Body.InnerHtml;
        // If the processing is time-consuming, then you could spin
        // off a BackgroundWorker here
    }
}
于 2012-10-26T07:16:50.827 に答える