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的更多相关文章

  1. C# 后台线程更新UI控件

    /********************************************************************************* * C# 后台线程更新UI控件 * ...

  2. 一种WPF在后台线程更新UI界面的简便方法

    WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面.幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法 ...

  3. WPF子线程更新UI(Dispatcher.BeginInvoke)

       在做WPF开发时,如果直接在子线程里更新UI会报错—–“调用线程无法访问此对象,因为另一个线程拥有该对象.”,这是因为WPF禁止在非UI线程里直接更新UI界面. 解决方案:   在子线程里调用D ...

  4. C# 跨线程更新 UI

    Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...

  5. WPF 非UI线程更新UI界面的各种方法小结

    转载:https://www.cnblogs.com/bdbw2012/articles/3777594.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在 ...

  6. WPF Dispatcher.BeginInvoke子线程更新UI

    在开发WPF应用时出现:”调用线程无法访问此对象,因为另一个线程拥有该对象.“ 是因为UI线程是WPF应用的主线程,若尝试子线程更新UI线程应使用Dispatcher.BeginInvoke()或者I ...

  7. c#后台线程更新界面

    参考文章<C# 线程更新UI界面> 主窗口 public frmMain() { InitializeComponent(); } /// <summary> /// 主窗口加 ...

  8. Winform非UI线程更新UI界面的各种方法小结

    我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...

  9. 非UI线程更新UI界面的各种方法小结

    转载:https://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645541.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控 ...

随机推荐

  1. ubantu 16.4 Hadoop 完全分布式搭建

    一个虚拟机 1.以  NAT网卡模式   装载虚拟机 2.最好将几个用到的虚拟机修改主机名,静态IP     /etc/network/interface,这里 是 s101 s102  s103 三 ...

  2. Flex自动回收导致监听不到ModuleEvent.READY事件

    Flex中可以动态载入模块,以达到延迟加载,减小主程序体积的效果.通常可以使用如下代码: var iminfo:IModuleInfo = ModuleManager.getModule(" ...

  3. Pycharm代码补齐功能中的图标的意思

    分清楚图标的意思就能更好的使用对应的方法.类,避免错误使用括号 PS:博主老是给属性方法加上括号   代表方法: 红色的m.f,   代表类变量: 黄色的f     之前遇到个属性方法: 好像是p,无 ...

  4. MySQL客户端连接方式

    MySQL连接方式MySQL除了最常见的TCP连接方式外,还提供SOCKET(LINUX默认连接方式).PIPE和SHARED MEMORY连接方式.各连接方式的服务器.客户端启动选项,及连接默认值见 ...

  5. Windows:服务已经标记为删除

    解决办法: 方法一:运行删除服务项命令的时候,服务管理窗口未关闭,关闭服务管理窗口即可: 方法二:删除服务的注册表项,路径为: HKEY_LOCAL_MACHINE\SYSTEM\CurrentCon ...

  6. ShellCode初体验

    写在前面的话: ShellCode是一门艺术,就像围棋手门追求的“神之一手”,今天就来初探一下这让人疯狂的艺术: 零.代码0 相信手写opcode,目前很少有人干了,其实,也确实已经没有这个必要了,毕 ...

  7. 等我干IT发财了,就和你离婚。。。。。

    01 “等我干IT发财了,就和你离婚” 他淡淡地说 听完后,她心里暖暖的, 她想,没有比这更天长地久. 海枯石烂的承诺了. ——2018年度最佳微小说奖 02 “等我干IT发财了,我就买房和你结婚.” ...

  8. SDN 第四次作业

    阅读 了解SDN控制器的发展 http://www.sdnlab.com/13306.html http://www.docin.com/p-1536626509.html 了解ryu控制器 http ...

  9. 阿里八八Alpha阶段Scrum(11/12)

    今日进度 叶文滔: 合并日程界面debug成功,但是目前出现了新的问题,日程界面一些控件无法适配屏幕,正在排查问题 李嘉群: 尝试用okhttp的方式发送请求 王国超: 今天开始进行recycerli ...

  10. 【转】Android 4.4中播放HTML5视频<video>的Bug

    近期Nexus 4手机自动升级到Android4.4,本来挺好的一件事儿,结果发现自己的应用中出现一个Bug,应用中使用了Webview播放HTML5视频,代码如下: <video width= ...