WPF学习笔记2——WPF子线程更新UI
1.Dispatcher
WPF应用程序的主线程负责创建UI界面、接收输入、处理事件等任务,在开发中常用子线程处理一些耗时的操作(为了主线程能及时响应,防止假死),但是子线程是不能直接更新UI界面。Dispatcher的作用是管理线程工作项队列,我们可以使用Dispatcher更新UI界面。
2.使用Dispatcher更新UI界面
下面是一个简单的例子,在子线程直接更新主线程维护的界面。
using System;
using System.Threading;
using System.Windows;
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(ModifyLabel);
lblShow.Content = "开始工作";
thread.Start();
}
private void ModifyLabel()
{
// 模拟工作正在进行
Thread.Sleep(TimeSpan.FromSeconds(2));
lblShow.Content = "结束工作";
}
}
}
错误截图:
在子线程中使用Dispatcher.BeginInvoke()方法更新UI。
using System;
using System.Threading;
using System.Windows;
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Thread thread = new Thread(ModifyLabel);
lblShow.Content = "开始工作";
thread.Start();
}
private void ModifyLabel()
{
// 模拟工作正在进行
Thread.Sleep(TimeSpan.FromSeconds(2));
//子线程更新UI线程可以使用Dispatcher.BeginInvoke()或者Invoke()方法。
this.Dispatcher.BeginInvoke(new Action(() =>
{
//更新操作
lblShow.Content = "结束工作";
}));
}
}
}
子线程更新UI可以使用Dispatcher.BeginInvoke()或者Invoke()方法,Dispatcher.Invoke()是同步执行