2010-12-28 8 views
0

私はbackgroundworker & webbrowserを使用して、いくつかのWebページをナビゲートしようとしました。私はそれが動作しないこの機能を使用しています。私は何がここで間違っているのか分からない。BackgroundWorker + WebBrowser

MessageBox.Show(arr [0])のみが表示されます。他には何もない。 Webブラウザも変更されません

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" }; 
    for (int i = 0; i < 3; i++) 
    { 
     MessageBox.Show(arr[i]); 
     bB_checker.Invoke((EventHandler)delegate { bB_checker.Navigate(arr[i]); }); 
     while (bB_checker.ReadyState != WebBrowserReadyState.Complete) 
     { 
      // System.Threading.Thread.Sleep(100); 
      Application.DoEvents(); 
     } 
    } 
} 
+0

「動作しません」よりも少し具体的にする必要があります。例外はありますか?あなたはそれを踏み出すことができますか? – Brook

+0

"うまくいかない"ということを詳しく説明できますか?間違い、間違った出力、または出力がありませんか? – ChrisF

+0

デリゲートを呼び出す必要がありますか?私はNavigateが非同期操作であり、このメソッドが既にGUIスレッドによって呼び出されているようだと思いました。たとえそれが非同期でないとしても、あなたはそれをとにかく待っています。 –

答えて

4

がRunWorkerCompletedイベントハンドラでe.ErrorプロパティをチェックせずにBGWを実装することはありませんを参照してください。 WebBrowserはスレッドセーフではありません。ワーカースレッドにWBを作成する方法については、this answerを参照してください。

ただし、ブラウザをユーザーに見えるようにする必要がある場合は、これは良い方法ではありません。その場合、スレッドを使用することをあきらめなければなりません。実際の問題ではなく、DocumentCompletedイベントハンドラの配列インデックスをカウントアップするだけです。これらのWebページをフラッシュするのはほとんど意味がありません。

+0

+1のコード例 –

1

WebBrowserコントロールのプロパティは、UIスレッドの外部からアクセスすることはできません。プロパティはカバーの下にあるメソッドなので、Invokeを使用してNavigateを呼び出す必要があるのと同じ理由があります。

バックグラウンドワーカーがあなたのUIスレッドとは異なるスレッドで実行されているため、Application.DoEvents()は必ずしも動作するとは限りません。

もなく、ポーリングWebブラウザーの状態、あなたの非同期通知を取得するためにDocumentCompletedイベントを使用します。

int i = 0; 
string[] arr = { "http://stackoverflow.com/", "http://www.codeproject.com/", "http://www.codeplex.com/" }; 

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 
    bB_checker.DocumentCompleted += bB_checker_DocumentCompleted; 
    bB_checker.Navigate(arr[0]); 
} 

void bB_checker_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    i++; 
    if (i < arr.Length) 
     bB_checker.Navigate(arr[i]); 
} 
0

はAllowNavigationプロパティは、私がTrueに設定されていることを確認してください。

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
     if (e.Error != null) MessageBox.Show(e.Error.ToString()); 
    } 

やや神秘的な無効なキャスト例外がワーカースレッド上のreadyStateプロパティを使用することによって発生します http://dotnetpulse.blogspot.com/2006/07/why-wont-webbrowser-navigate.html