[英]BackgroundWorker stops the WPF UI to be refreshed
前段時間,我編寫了一個簡單的應用程序,該應用程序使用了使用BackgroundWorker的基於WPF的UI:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
LoadTextBlock.Visibility = Visibility.Hidden;
if (e.Error == null)
{
foreach (TechNews news in (e.Result as List<TechNews>))
{
NewsListBox.Items.Add(news);
}
}
else
{
MessageBox.Show(e.Error.Message, "Error");
}
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
CNetTechNewsParser parser = new CNetTechNewsParser();
parser.Parse();
e.Result = parser.News;
}
}
那時,它工作得很好。 但是現在我再次啟動它,發現UI停止刷新,即LoadTextBlock不會消失,新聞也不會顯示在列表框中。 只有在我最小化應用程序后,它才會刷新。
我從DoWork中刪除了所有解析功能,但效果相同。 然后注釋RunWorkerAsync,UI開始正常工作。 因此,我建議問題是由BackgroundWorker引起的。 但是我不明白這是怎么回事?
謝謝
我很困惑,沒有拋出無效的跨線程錯誤(UnauthorizedAccessException),但是盡管如此,您仍然可以使用擴展方法在目標控件的正確分派器上調用UI Update邏輯。
public static class WindowExtensions
{
public static void Dispatch(this Control control, Action action)
{
if (control.Dispatcher.CheckAccess())
action();
else
control.Dispatcher.BeginInvoke(action);
}
}
在您的情況下,用法如下:
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Dispatch(() =>
{
LoadTextBlock.Visibility = Visibility.Hidden;
if (e.Error == null)
{
foreach (TechNews news in (e.Result as List<TechNews>))
{
NewsListBox.Items.Add(news);
}
}
else
{
MessageBox.Show(e.Error.Message, "Error");
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.