今天用.NET 4.5中的TPL的特性做了个小例子,实现了WPF的进度条progressbar,运行时间elapse time和等待spinner。

先上图吧。

这个例子包含4个实现,分别是同步版本(Sync),异步版本(Async),并发版本(Parallel)和通过数据绑定实现的并发版本(Parallel with Data Binding)。代码放在了Github上。其中Spinner的实现来源于stackoverflow上Drew Noakes提供的代码。

1. 同步版本(Sync)

这个版本中进度条、运行时间都不能更新,而且用户不能取消,因为所有的工作都是在UI线程中做的,整个UI被阻塞了。示例代码如下:

 123456789
10
11
        internal override void Start(){startWaiting();for (int i = 1; i <= Job.JobNumber; i++){Job.TimeConsumingJob();m_FinishedJob++;m_Progressbar.Value = m_FinishedJob;}stopWaiting();}

2. 异步版本(Async)

使用C#的awaitasync关键字实现异步调用,这样进度条、运行时间都可以更新了,而且用户可以取消,因为UI没有被阻塞。示例代码如下:

 123456789
10
11
12
13
14
15
16
17
18
19
20
        internal override async void Start(){startWaiting();try{for (int i = 1; i <= Job.JobNumber; i++){await Task.Factory.StartNew(Job.TimeConsumingJob, m_CancellationTokenSource.Token);m_FinishedJob++;m_Progressbar.Value = m_FinishedJob;}}catch (OperationCanceledException){m_CancellationTokenSource = new CancellationTokenSource();}stopWaiting();}

3. 并发版本(Parallel)

把后台的工作都并发处理了,除了不阻塞UI之外处理速度得到了提高。示例代码如下:

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        internal override async void Start(){startWaiting();List<Task> taskList = new List<Task>();for (int i = 1; i <= Job.JobNumber; i++){taskList.Add(Task.Factory.StartNew(Job.TimeConsumingJob).ContinueWith(t =>{m_FinishedJob++;m_Progressbar.Value = m_FinishedJob;},m_CancellationTokenSource.Token,TaskContinuationOptions.None,TaskScheduler.FromCurrentSynchronizationContext()));}try{await Task.WhenAll(taskList);}catch (OperationCanceledException){m_CancellationTokenSource = new CancellationTokenSource();}stopWaiting();}

4. 通过数据绑定实现的并发版本(Parallel with Data Binding)

一样是并发,但是用了Data Binding,没有直接操作UI控件。

转载于:https://www.cnblogs.com/fresky/p/3228471.html

WPF的进度条progressbar,运行时间elapse time和等待spinner的实现相关推荐

  1. Xamarin XAML语言教程构建进度条ProgressBar

    Xamarin XAML语言教程构建进度条ProgressBar Xamarin XAML语言教程构建进度条ProgressBar,ProgressBar被称为进度条,它类似于没有滑块的滑块控件.进度 ...

  2. 【鸿蒙 HarmonyOS】UI 组件 ( 进度条 ProgressBar 和 RoundProgressBar 组件 )

    文章目录 一.布局中设置 ProgressBar.RoundProgressBar 进度条 二.代码中设置 ProgressBar.RoundProgressBar 进度条 三.完整代码示例 四.Gi ...

  3. Windows Phone 7开发,进度条ProgressBar使用详解

    进度条在应用中的作用非常大,可以告诉用户当前操作执行的进度,以免用户在等待中失去耐心,进而关闭应 用.Windows Phone 7的进度条有两种样式,一种是从左往右循环滚动的小点点,这种进度条并不能 ...

  4. Android 各种自定义进度条Progressbar

    Android 自定义进度条 Progressbar 控件集合 关于我,欢迎关注 博客:ccapton(http://blog.csdn.net/ccapton) 微信:Ccapton Github ...

  5. progressblock 安卓自定义进度条 progressbar 高仿仿QQ下载进度条

    progressblock 安卓自定义进度条 progressbar 高仿仿QQ下载进度条 附上我在公司做下载播放项目 主要使用方法 progressBlock = (ProgressBlock) f ...

  6. 安卓开发之WebView,进度条ProgressBar以及MediaPlayer和SonundPool的使用

    原 安卓开发之WebView,进度条ProgressBar以及MediaPlayer和SonundPool的使用 2018年06月06日 15:04:21 阅读数:106 内容比较简单,仅用作笔记,所 ...

  7. android进度条课设报告,Android开发之进度条ProgressBar的示例代码

    说明 ProgressBar一般用于显示一个过程,例如数据加载过程,文件下载进度,音乐播放进度等. 默认形式ProgressBar 默认方式下,ProgressBar显示为圆形进度,循环转圈,不显示具 ...

  8. android圆形进度条ProgressBar颜色设置

    原帖地址:http://www.apkbus.com/android-19012-1-1.html xml布局文件需加入如下的进度条构件: Java代码 <ProgressBar android ...

  9. android 进度条 代码,Android进度条ProgressBar的实现代码

    ProgressBar进度条 当一个应用在后台执行时,前台界面不会有任何信息,这时,用户根本不知道程序是否在执行以及执行的进度等, 因此需要使用进度条来提示程序执行的进度. 而ProgressBar就 ...

最新文章

  1. p3c插件 离线安装_IntelliJ IDEA18个常用插件,动图演示,让你效率翻倍!
  2. Caused by: org.apache.ibatis.reflection.ReflectionException我碰到的情况,原因不唯一
  3. python--二进制的用法
  4. Java 负数、零、正数的个数
  5. php与c语言流程控制语句,小蚂蚁学习C语言(7)——C语言流程控制之if
  6. 记一次性能优化,限制tcp_timewait数量,快速回收和重用
  7. HDU多校1 - 6955 Xor sum(字典树+贪心)
  8. 美团外卖iOS多端复用的推动、支撑与思考
  9. .Net Core 开发成长路线图
  10. python面试题之下面这些是什么意思:@classmethod, @staticmethod, @property?
  11. ionic 上拉加载更多
  12. Win Form中限制TextBox只能输入数字
  13. logo设计好坏的12个标准
  14. 麦克风阵列原理(转载)
  15. ABP框架使用打印日志
  16. 微信小程序地图实现展示路线路
  17. 2020年信工所考研经验分享
  18. git提交代码至码云
  19. Mac上通过docker配置PHP开发环境
  20. Ubuntu18.04+TITAN XP+anaconda+cuda10+cudnn+pytorch

热门文章

  1. 一门正在消失的技艺——Vanilla JavaScript
  2. 利用outlook自动回复邮件
  3. python 将MP3格式转换为WAV格式(ffmpeg安装,使用pycharm安装包)
  4. 震动筛超声波探头换能器设计
  5. Android 设置状态栏背景颜色和状态栏文字、图标颜色
  6. 利用随机方法得到一个随机验证码 #java
  7. Cisco GETVPN
  8. python判断三角形是否成立_Python判断三角形
  9. 先学vb还是python_一个初一学生学习编程先学VB好呢还是Python?
  10. Filezilla windows 下载安装完全教程