相关文章推荐
喝醉的镜子  ·  WPF 线程操纵UI问题 - Lulus ·  14 小时前    · 
飘逸的核桃  ·  visual c++ - Is ...·  1 年前    · 

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使用一个专用的 UI 线程来完成界面的操作和更新,这个线程会关联一个唯一的WPF Dispatcher 对象,用于调度按优先顺序排列的工作项队列。Application.Run() 实际上就是对 Dispatcher.Run() 的间接调用。

WPF Dispatcher通过循环来处理工作项队列,这个循环通常被成为 "帧 (DispatcherFrame)"。Dispatcher.Run() 创建并启动这个帧,这也是 Application.Run() 启动消息循环的最终途径。

线程处理模型

ChangeUI

学习技术最好的文档就是官方文档,没有之一。
还有学习资料Microsoft LearnCSharp LearnMy Note
如果,你认为阅读这篇博客让你有些收获,不妨点击一下右下角的推荐按钮。
如果,你希望更容易地发现我的新博客,不妨点击一下关注