2

まず、コードを投稿します。

public partial class MainWindow : Window
{
    private readonly BackgroundWorker worker = new BackgroundWorker();
    private List<string> list = new List<string>();
    private List<string> arrOfAdresses = new List<string>();

    public MainWindow()
    {
        InitializeComponent();
        worker.DoWork += worker_DoWork;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        list.Add("http://www.yahoo.com");
        list.Add("http://www.google.com");
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("All is done");
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        foreach (string s in list)
        {
            WebBrowser bro = new WebBrowser();
            bro.Width = bro.Height = 1;
            grid.Children.Add(bro);
            bro.Navigate(s);
            bro.LoadCompleted += OnLoadCompleted;
        }
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        worker.RunWorkerAsync();
    }

    private void OnLoadCompleted(object sender, NavigationEventArgs e)
    {
        WebBrowser bro = sender as WebBrowser;
        this.arrOfAdresses.Add(bro.Source.ToString()+"Added text");
        MessageBox.Show("xxx"); //MessageBox is ignored
    }

    private void shower_Click(object sender, RoutedEventArgs e)
    {
        arrOfAdresses.Reverse();
        foreach (string s in arrOfAdresses)
            MessageBox.Show(s);
    }
}

button_clickイベントはアドレスを に保存する必要arrOfAdresseがありますが、これは少し変更されます。

次に、 にshower_Clickあるすべての変更された値を表示する必要がありますarrOfAdresses。にあるはずの値を表示したい場合、arrOfAdresses何も返されません。LoadCompletedMessageBox を配置すると、プログラムはそれを無視するため、問題は発生していると思います。が発生したときに値を表示できる方法shower_Clickはありますか?それを修正する方法はありますか? 返信ありがとうございます。

4

4 に答える 4

1

DoWork は別のスレッドで実行されるため、UI に (直接) 触れることはできません。最も明白な犯罪者:

  grid.Children.Add(bro);

しかし、WebBrowser を作成してロードすることもおそらく問題ありません。

ここで学ぶべき最も重要な教訓:

  • Completed イベントでは常にe.Error最初にプロパティを確認してください。
于 2013-09-22T15:33:16.087 に答える
0

私はWebbrowserでこのようなことをしました。メインスレッドから呼び出しても、実際には別のスレッドで行われるWebブラウザでの進行状況の読み込み。したがって、私の場合、多くの状況で、onLoadComplete または onPregress イベントのいずれかの行の間にエラーがある場合、エラーはスローされません。方法や理由はわかりません。しかし、私がすることはデバッグだけです。onLoadComplete イベントの開始行にブレークポイントを配置し、行ごとに分析する必要があります.Try Catch でさえ結果が得られませんが、これは結果をもたらします..そして、プログラムが次の行をスキップする行でエラーが発生します..

于 2013-09-22T13:51:21.527 に答える
0

行にエラーが発生します

this.arrOfAdresses.Add(bro.Source.ToString()+"Added text");
于 2013-09-22T13:55:47.933 に答える
0

メッセージ ボックスを単に無視する方法はありません。その上の行が例外をスローした可能性があります。WPF は、例外がスローされたときにアプリケーションをクラッシュさせず、代わりにそれらをデバッグ出力に記録します。例外を探してください。何が問題なのかがわかります。

ほとんどの場合、UI スレッドで行が発生しないため、例外がスローされます。その場合は、次のように、ディスパッチャーを使用してコマンドを実行するだけです。

Dispatcher.Invoke(new Action(() => arrOfAdresses.Add(bro.Source.ToString() + "Added text")));

サンプルのディスパッチャーはウィンドウのプロパティであることに注意してください: http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.dispatcher(v=vs.95).aspx

于 2013-09-22T13:33:54.930 に答える