WPF后台线程更新UI
0、讲点废话
最近在做一个文件搜索的小软件,当文件多时,界面会出现假死的状况,于是乎想到另外开一个后台线程,更新界面上的ListView,但是却出现我下面的问题。
1、后台线程问题
2年前写过一个软件,里面后台线程是用如下方法:
Thread searchFileThread = new Thread(new ThreadStart(StartSearchFile)); //搜索文件后台线程
searchFileThread.IsBackground = true;
searchFileThread.Start();
虽然我将IsBackground属性置为true了,但是依然没有用,界面依然卡顿,不知为何,如果有大神路过,还请大神在评论区不吝赐教。最后上网baidu,google找了个别的办法,解决了它,效果还是很棒的。
2、解决界面假死问题
其实方法也很简单,微软早就想到此问题,提供了Dispather.Invoke()这一类方法。我将搜索到的文件放在lst_PaperList(这是一个Listview)中,StartSearchFile是我写的一个搜索文件的函数,然后用如下代码:
lst_PaperList.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(StartSearchFile));
嗯,就这么写完了。但是这样子写完,好像没有点什么技术含量,我也在网上找了个不用另外开线程,实现更UI的方法,在此也分享一下。
3、不用线程实时更新UI
我的搜索软件中有个进度条,本来以为在循环让ProgressBar.Value++,就能更新ProgressBar的进度,没料到却不能,还是想得太简单。因此找了个不用自已开线程来更新ProgressBar.Value的方法,这个方法严格来讲不能说没有开线程,只是微软给我们做了。方法如下:
Step1 定义一个委托
private delegate void UpdateUIDelegate(System.Windows.DependencyProperty dp, Object value);
Step2 使用Dispatcher.Invoke方法
这里说一下这个方法其中一个重载的作用Invoke(Delegate, DispatcherPriority, Object[] ),按指定的优先级并使用指定的参数在与 Dispatcher 关联的线程上同步执行指定的委托。更多的还是自行查MSDN。代码如下(其中pb_Search是我定义的一个进度条):
UpdateUIDelegate updatePbDelegate = new UpdateUIDelegate(pb_Search.SetValue); Dispatcher.Invoke(updatePbDelegate, System.Windows.Threading.DispatcherPriority.Background,
new object[] { System.Windows.Controls.ProgressBar.ValueProperty, Convert.ToDouble(pb_Search.Value) });
完成了,就是这么简单粗暴。上面的代码不要生搬硬套,在适当的地方使用。
照葫芦画瓢,实时更新TextBlock的值
在WPF中,这个用绑定也行,但是效果可能没有这个好。代码如下(其中txt_SearchCount是用来显示搜索结果个数的):
UpdateUIDelegate updateTbDelegate = new UpdateUIDelegate(txt_SearchCount.SetValue); Dispatcher.Invoke(updateTbDelegate, System.Windows.Threading.DispatcherPriority.Background,
new object[] { System.Windows.Controls.TextBlock.TextProperty, Convert.ToString(lst_EPaper.Count) });
WPF后台线程更新UI的更多相关文章
- C# 后台线程更新UI控件
/********************************************************************************* * C# 后台线程更新UI控件 * ...
- 一种WPF在后台线程更新UI界面的简便方法
WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面.幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法 ...
- WPF子线程更新UI(Dispatcher.BeginInvoke)
在做WPF开发时,如果直接在子线程里更新UI会报错—–“调用线程无法访问此对象,因为另一个线程拥有该对象.”,这是因为WPF禁止在非UI线程里直接更新UI界面. 解决方案: 在子线程里调用D ...
- C# 跨线程更新 UI
Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...
- WPF 非UI线程更新UI界面的各种方法小结
转载:https://www.cnblogs.com/bdbw2012/articles/3777594.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在 ...
- WPF Dispatcher.BeginInvoke子线程更新UI
在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象.“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者I ...
- c#后台线程更新界面
参考文章<C# 线程更新UI界面> 主窗口 public frmMain() { InitializeComponent(); } /// <summary> /// 主窗口加 ...
- Winform非UI线程更新UI界面的各种方法小结
我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...
- 非UI线程更新UI界面的各种方法小结
转载:https://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645541.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控 ...
随机推荐
- 关于DAL层使用静态方法,并在WEB层直接调用的问题
同样的疑惑,记录一下吧: http://bbs.csdn.net/topics/360204198 DAL静不静态看connection等关键资源是否静态 比如下面的代码,就算静态也没事 public ...
- 字节顺序标记BOM
最近,从numbers导出的csv文件,导入excel后,出现中文乱码问题.网上查询后,发现是numbers导出的csv默认是utf-8无BOM的,使用sublimText3打开,另存为utf-8wi ...
- She Left Her Shoes
She left her shoes, she took everything else, her toothbrush, her clothes, and even that stupid litt ...
- 【Redis数据库】再有人问你CAP理论是什么,就把这篇文章发给他
CAP是Consistency(一致性),Availability(可用性),Partition tolerance(分区容错性)的缩写.在学习redis过程中看到这个名词,查找各位大佬的文章发现这篇 ...
- Linux磁盘空间占满问题快速定位
1.df -h命令查看系统盘与各个磁盘的占用空间比率 [tidb@:vg_adn_tidbCkhsTest:172.31.30.62 /dev]$df -Th Filesystem Type Size ...
- 写博的第一天 0x00
作为一个大学生,我觉得自己除了睡觉,打游戏,吃饭更应该做点有意义的事情,作为计算机专业的学生,更应该勤奋点,主动去学习.已经要大三了,我认识到这个暑假我必须学点什么了,为了更好的学习,我决定学语言的同 ...
- php 错误1
Maximum execution time of 30 seconds exceeded 方法一,修改php.ini文件 max_execution_time = 30; Maximum execu ...
- leetcode 2. Add Two Numbers [java]
注意点: 最后的进位 (l1 == null || l1.next == null) break; public ListNode addTwoNumbers(ListNode l1, ListNod ...
- 面向对象的JavaScript --- 动态类型语言
面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...
- MP实战系列(十)之SpringMVC集成SpringFox+Swagger2
该示例基于之前的实战系列,如果公司框架是使用JDK7以上及其Spring+MyBatis+SpringMVC/Spring+MyBatis Plus+SpringMVC可直接参考该实例. 不过建议最好 ...