DoWork事件中的LoadCompleted事件

时间:2013-09-22 13:16:29

标签: c# wpf backgroundworker

首先,我发布了我的代码:

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中所拥有的价值时,它什么也没有给我回报。我认为,问题出现在LoadCompleted事件中,因为当我放置MessageBox时程序会忽略它。有什么方法可以显示值,当shower_Click被提升并且有什么方法可以修复它吗?谢谢你的回复。

4 个答案:

答案 0 :(得分:1)

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

  grid.Children.Add(bro);

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

最重要的一课要学习:

  • 始终先在已完成的事件中检查e.Error属性。

答案 1 :(得分:0)

消息框无法被忽略。最有可能是它上面的一条线引发了例外。抛出异常时,WPF不会使应用程序崩溃,而是将它们记录到Debug输出中。看那里有例外,你就会知道什么是错的。

最有可能抛出异常,因为UI线程中没有出现该行。如果是这种情况,您需要做的就是使用dispatcher运行命令,如下所示:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

中会出错
this.arrOfAdresses.Add(bro.Source.ToString()+"Added text");