DoWork 事件中的“加载已完成”事件
本文关键字:事件 已完成 加载已完成 加载 DoWork | 更新日期: 2023-09-27 18:32:15
首先,我发布我的代码:
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
事件中,因为当我放置消息框时,程序会忽略它。当shower_Click
被提出时,有什么方法可以显示值,有没有办法可以修复它?感谢您的回复。
DoWork 在另一个线程上运行,因此您不能(直接)触摸 UI。最明显的罪犯:
grid.Children.Add(bro);
但是创建和加载Web浏览器可能也不行。
这里要学习的最重要的一课:
- 始终首先在"已完成"事件中检查"
e.Error
"属性。
忽略消息框。很可能它上面的行抛出了异常。引发异常时,WPF 不会使应用程序崩溃,而是将它们记录到 Debug 输出中。在那里寻找异常,你就会知道出了什么问题。
最有可能引发异常,因为该行未出现在 UI 线程中。如果是这种情况,您需要做的就是使用调度程序运行命令,如下所示:
Dispatcher.Invoke(new Action(() => arrOfAdresses.Add(bro.Source.ToString() + "Added text")));
请注意,我的示例中的调度程序是 window 的属性:http://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.dispatcher(v=vs.95).aspx
我在Web浏览器中做过这样的事情。在 Web 浏览器中加载进度实际上是在单独的线程中完成的,即使您从主线程调用它。因此,就我而言,在许多情况下,如果onLoadComplete或onPregress事件中的任何行之间存在任何错误,则不会引发错误。我不知道如何或为什么。但我要做的只是调试。您必须将断点直接放入 onLoadComplete 事件的起始行,并逐行分析。即使尝试捕获也不会给出结果,但这确实如此。在程序跳过的行中,下一行将出现错误。
该行中将出现错误
this.arrOfAdresses.Add(bro.Source.ToString()+"Added text");