WPF只允许UI线程修改UI,其他线程必须通过Invoke、委托(安全性) Winform可以开启/关闭“只允许UI线程修改UI”
非UI线程直接修改UI,会报错
System.InvalidOperationException:“调用线程无法访问此对象,因为另一个线程拥有该对象。”
正确的做法是使用 Dispatcher Dispatcher简单暴力,适合小工作量的修改一些界面内容 长期后台工作应该考虑使用 BackgroundWorker ,有很多相关功能库
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
Java中常见的算法递归二分查找快速排序冒泡排序选择排序递归递归本质:程序调用自身的编程技巧叫做递归。方法的递归调用指的是一个方法自己调用自己的形式。一般如果要进行方法的递归操作往往都具备有以下的特点:方法必须有一个递归的结束条件;方法在每次递归处理的时候一定要做出一些变更;代码举例如下:public class Algorithm { public static voi