【发布时间】:2015-09-23 17:29:46
【问题描述】:
我正在运行一个 WPF 应用程序并想做这样的事情:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
TextBox textBox = new TextBox();
mainGrid.Children.Add(textBox);
textBox.Text = "one";
Thread.Sleep(1000);
textBox.Text = "two";
Thread.Sleep(1000);
textBox.Text = "three";
Thread.Sleep(1000);
textBox.Text = "four";
}
}
在所有这些处理完成之前,显示器不会加载,因此在运行上述代码后,我有一个空白的、无响应的应用程序,直到 3 秒和一个带有单词 4 的文本框。
我查看了 BackgroundWorker 类并尝试了这个:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Set up background worker object & hook up handlers
BackgroundWorker backgroundWorker;
backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);
backgroundWorker.RunWorkerAsync();
}
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
{
TextBox textBox = new TextBox();
mainGrid.Children.Add(textBox);
textBox.Text = "one";
Thread.Sleep(1000);
textBox.Text = "two";
Thread.Sleep(1000);
textBox.Text = "three";
Thread.Sleep(1000);
textBox.Text = "four";
}));
}
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Debug.WriteLine("done");
}
仍然是相同的行为。我想在后台/不同线程中运行一些任务,这些任务将在执行过程中对 UI 元素进行更改,我希望这些更改立即反映在显示中。
【问题讨论】: