公司内部一个项目是用WPF作为GUI 访问web接口的形式获取数据,

但是由于数据量比较大,也没做分页,于是就需要一个loading的控件,网上查了很多资料但都比较浅。这里完成需求后,总结一下。

首先。loading控件的实现基本上都是1.控件显示;2.后台访问查询;3.UI渲染;4.控件隐藏。

想要实现这部分,需要做到异步,这里使用BackgroundWorker 组件用来执行诸如数据库事务、文件下载等耗时的异步操作。

关于backgroundWorker这里不做过多的记录,已经有很多人进行了系统的用法归类,这里仅仅使用其以下方法:

1.BackgroundWorker bgMeet = new BackgroundWorker();  //创建对象

2.bgMeet.WorkerReportsProgress = true;   //为了显示后台操作的执行进度,一般使用进度条时可以用其配套的ReportProgress()方法,通过它传递操作完成的进度值,此外,该方法触发ProgressChanged事件,在是此事件中,通过ProgressChangedEventArgs的实例,接收到主线程传递过来的参数。

3.bgMeet.DoWork += new DoWorkEventHandler(bgMeet_DoWork);//后台需要做的

4.bgMeet.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgMeet_RunWorkerCompleted);//完成后,反馈

下面是dowork方法:

1.loading控件显示

this.Dispatcher.Invoke(DispatcherPriority.Background,new Action(() =>
{

this.loading.Visibility = Visibility.Visible;

}));//这里需要用dispatcher.invoke 因为WPF却明确的规定:UI元素只能由其主线程来操作

2.从接口获取数据 getData();//这里访问接口不能用dispatcher.invoke 否则会造成页面假死现象  因为子线程去访问时,由于时间长,会造成UI卡住

3.渲染数据

下面是completed方法:隐藏loading控件

void bgMeet_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{

this.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
{
this.loading.Visibility = Visibility.Collapsed;
}));

}

WPF非UI线程访问网络资源造成页面假死现象的更多相关文章

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

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

  2. WPF非UI线程中调用App.Current.MainWindow.Dispatcher提示其他线程拥有此对象,无权使用。

    大家都知道在WPF中对非UI线程中要处理对UI有关的对象进行操作,一般需要使用委托的方式,代码基本就是下面的写法 App.Current.MainWindow.Dispatcher.Invoke(ne ...

  3. WPF非UI线程获取修改控件属性值的方法

    public class InvokeHelper { #region delegates private delegate object MethodInvoker(Control control, ...

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

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

  5. Android UI线程和非UI线程

    Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...

  6. android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换

    经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 ...

  7. 关于 SWT 的UI线程和非UI线程

    要理解UI线程,先要了解一下“消息循环”这个概念.链接是百度百科上的条目,简单地说,操作系统把用户界面上的每个操作都转化成为对应的消息,加入消息队列.然后把消息转发给对应的应用程序(一般来说,就是活动 ...

  8. 一个解决在非UI线程中访问UI 异常的小方法

    写 WPF 的童鞋可能都会碰到 在非UI线程中访问 UI 异常的问题.这是为了防止数据不一致做的安全限制. 子线程中更新UI还要交给主线程更新,引用满天飞,实在是麻烦. 接下来,我们推出一个可以称之为 ...

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

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

随机推荐

  1. 2019年RTC大会记录

    小编近期在研究webRTC点对点通信技术,怀着学习的心态参加了2019年RTC大会,对所见所闻做下记录,不对的地方还请批评指正! 这次热门的话题是5G.WebRTC.AI对图像.音视频的相关处理,思科 ...

  2. HDU 4886 TIANKENG’s restaurant(Ⅱ) ( 暴力+hash )

    TIANKENG’s restaurant(Ⅱ) Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 130107/65536 K (Ja ...

  3. flex 的经典用法

    Document   11 21 31 41 51 61 71 81 91 101 111 121 131 141 151 161 171 181 191 201 211 221 231 241 25 ...

  4. cglib代理与jdk动态代理示例

    先看基于jdk实现的动态代理实现例子 1.先声明一个接口类 public interface UserService{ public String getName(String msg); } 2.实 ...

  5. Git分支,合并,切换分支的使用

    1.创建合并分支 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指向提交 ...

  6. vue实现前后台交互

    首先需要前台先安装一个包 cnpm install axios --save 第二还需要解决跨域问题 在settings中添加一条中间件 MIDDLEWARE = [“corsheders.middl ...

  7. hdu 1402 A * B Problem Plus (FFT模板)

    A * B Problem Plus Problem Description Calculate A * B. Input Each line will contain two integers A ...

  8. JS基础入门篇(二十四)—DOM(上)

    1.常用的节点类型,nodeType,attributes,childNodes. 1.元素节点 - 1 2.属性节点 - 2 3.文本节点 - 3 4.注释节点 - 8 5.文档节点 - 9 查看节 ...

  9. HTML5: HTML5 介绍

    ylbtech-HTML5: HTML5 介绍 1. 什么是 HTML5?返回顶部   HTML5 是下一代 HTML 标准. HTML,HTML 4.01的上一个版本诞生于1999年.自从那儿以后, ...

  10. PHP面试 MySQL查询优化

    MySQL查询优化 面试题一 请简述项目中优化SQL语句执行效率的方法,从那些方面,SQL语句性能如何分析? 优化查询过程中的数据访问.优化长难的查询语句.优化特定类型的查询语句 分析SQL语句方法 ...