WPF只允许UI线程修改UI,其他线程必须通过Invoke、委托(安全性)
Winform可以开启/关闭“只允许UI线程修改UI”
在WPF中非UI线程修改UI的方法:Dispatcher
非UI线程直接修改UI,会报错
System.InvalidOperationException:“调用线程无法访问此对象,因为另一个线程拥有该对象。”
正确的做法是使用Dispatcher
Dispatcher简单暴力,适合小工作量的修改一些界面内容
长期后台工作应该考虑使用BackgroundWorker,有很多相关功能库
Task t = new Task(() =>
{
//wrong
//NameLabel.Content = "我用非UI线程修改NameLabel的文字,失败了";
NameLabel.Dispatcher.Invoke(new Action(delegate
{
NameLabel.Content = "我用UI线程修改了NameLabel的文字";
}));
Thread.Sleep(5000);
this.Dispatcher.Invoke(new Action(() =>
{
NameLabel.Content = "我用UI线程修改了NameLabel的文字-2";
}));
Thread.Sleep(5000);
this.Dispatcher.BeginInvoke(new Action(() =>
{
NameLabel.Content = "我用UI线程修改了NameLabel的文字-3";
}));
});
t.Start();
Dispatcher使用一