前一段時間我寫了基於WPF的UI的簡單應用程序使用的BackgroundWorker:的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引起的。但我不明白它有什麼問題嗎?
感謝
什麼是worker_RunWorkerCompleted功能的線程上下文?可能這個函數執行不正確的跨線程操作。嘗試使用Dispatcher.BeginInvoke進行UI更新,而不是直接控制訪問。 –
@AlexFarber先前嘗試過Dispatcher.Invoke,沒有運氣。現在嘗試你的變體和瞧 - 它的工作原理!但更有趣的是,我嘗試了一次直接訪問 - 現在它也可以工作了!這是神祕的...無論如何,感謝您的答案,問題看起來被解決。 –