zoukankan      html  css  js  c++  java
  • WPF后台线程更新UI

    0、讲点废话

    最近在做一个文件搜索的小软件,当文件多时,界面会出现假死的状况,于是乎想到另外开一个后台线程,更新界面上的ListView,但是却出现我下面的问题。

    1、后台线程问题

    2年前写过一个软件,里面后台线程是用如下方法:

    1 Thread searchFileThread = new Thread(new ThreadStart(StartSearchFile));  //搜索文件后台线程
    2 searchFileThread.IsBackground = true;
    3 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是我定义的一个进度条):

    1 UpdateUIDelegate updatePbDelegate = new UpdateUIDelegate(pb_Search.SetValue);
    2 
    3 Dispatcher.Invoke(updatePbDelegate, System.Windows.Threading.DispatcherPriority.Background,
    4                   new object[] { System.Windows.Controls.ProgressBar.ValueProperty, Convert.ToDouble(pb_Search.Value) });

    完成了,就是这么简单粗暴。上面的代码不要生搬硬套,在适当的地方使用。

    照葫芦画瓢,实时更新TextBlock的值

    在WPF中,这个用绑定也行,但是效果可能没有这个好。代码如下(其中txt_SearchCount是用来显示搜索结果个数的):

    1 UpdateUIDelegate updateTbDelegate = new UpdateUIDelegate(txt_SearchCount.SetValue);
    2 
    3 Dispatcher.Invoke(updateTbDelegate, System.Windows.Threading.DispatcherPriority.Background,
    4                   new object[] { System.Windows.Controls.TextBlock.TextProperty, Convert.ToString(lst_EPaper.Count) });
  • 相关阅读:
    百度地图设置div样式宽高为百分比不显示地图
    C#添加修改控件css样式
    斐波那契查找原理详解与实现
    JavaWeb 如何在web.xml中配置多个servlet
    eclipse中添加tomcat ServerName 无法输入
    java 面试题
    JSON 转 对象
    Eclipse 导入Maven 项目报错
    Mybatis 中 update 语句 动态 语句
    oracle 将当前系统时间戳插入timestamp字段
  • 原文地址:https://www.cnblogs.com/endlesscoding/p/9314273.html
Copyright © 2011-2022 走看看