我正在运行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元素进行更改,并且我希望这些更改立即反映在显示中 .
3 回答
考虑使用
async
和await
代替:关于这个问题,这是一个相当不错的tutorial .
我同意以前的海报,但是如果你想使用后台工作人员考虑看看这个教程:http://www.wpf-tutorial.com/misc/multi-threading-with-the-backgroundworker/
基本上UI需要在一个线程上运行 . 否则你就失去了重点 .
async await可能是最好的答案,但是在这种情况下也可以使用计时器 .