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_clickevent 应该将地址存储到arrOfAdresse中,这将稍作修改。

接下来,shower_Click应该显示所有修改过的值arrOfAdresses。当我想显示我应该拥有的值时arrOfAdresses,它什么也没给我。我认为,问题出在LoadCompleted事件中,因为当我放置 MessageBox 时,程序会忽略它。有什么方法可以显示价值,什么时候shower_Click提出,有什么方法可以解决它?感谢您的回复。

4

4 回答 4

1

DoWork 在另一个线程上运行,因此您不能(直接)触摸 UI。最明显的罪犯:

  grid.Children.Add(bro);

但是创建和加载 WebBrowser 可能也不行。

在这里学到的最重要的一课:

  • 始终e.Error在 Completed 事件中首先检查属性。
于 2013-09-22T15:33:16.087 回答
0

行会有错误

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

我在 Webbrowser 中做过类似的事情。即使您从主线程调用它,实际上在单独的线程中加载 webbrowser 中的进度也是如此。因此,在我的情况下,在许多情况下,如果 onLoadComplete 或 onPregress 事件中的任何行之间有任何错误,则不会引发错误。我不知道如何或为什么。但我要做的只是调试。您必须将断点放在 onLoadComplete 事件的起始行,并逐行分析..即使 Try Catch 也不会给出结果,但这确实..并且在程序跳过下一行的行将出现错误..

于 2013-09-22T13:51:21.527 回答
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 回答