今天用.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被阻塞了。示例代码如下:

 1
2
3
4
5
6
7
8
9
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没有被阻塞。示例代码如下:

 1
2
3
4
5
6
7
8
9
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之外处理速度得到了提高。示例代码如下:

 1
2
3
4
5
6
7
8
9
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控件。

WPF的进度条progressbar,运行时间elapse time和等待spinner的实现的更多相关文章

  1. WPF 进度条ProgressBar

    今天研究了一下wpf的进度条ProgressBar 1.传统ProgressBar WPF进度条ProgressBar 这个控件,如果直接写到循环里,会死掉,界面会卡死,不会有进度.需要把进度条放到单 ...

  2. Android 自学之进度条ProgressBar

    进度条(ProgressBar)也是UI界面中的一种非常使用的组件,通常用于向用户显示某个耗时完成的百分比.因此进度条可以动态的显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应, ...

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

    花样android Progressbar http://www.eoeandroid.com/thread-1081-1-1.html http://www.cnblogs.com/xirihanl ...

  4. Android-SpinKit 进度条 (ProgressBar)

    项目地址: https://github.com/ybq/Android-SpinKit 类别: 进度条 (ProgressBar) 打分: ★★★★★ 更新: 2016-03-28 11:17 大小 ...

  5. 进度条ProgressBar

    在本节中,作者只写出了进度条的各种样式,包括圆形.条形,还有自定义的条形,我想如果能让条形进度条走满后再继续从零开始,于是我加入了一个条件语句.作者的代码中需要学习的是handler在主线程和子线程中 ...

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

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

  7. wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合

    wpf 导出Excel   1 private void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 4 ExportDataGrid ...

  8. Android零基础入门第51节:进度条ProgressBar

    原文:Android零基础入门第51节:进度条ProgressBar 不知不觉这已经是第51期了,在前面50期我们学了Android开发中使用频率非常高的一些UI组件,当然这些组件还不足够完成所有AP ...

  9. WPF 自定义进度条

    WPF设计界面过程中,有时需要设计一种可以手动滑动修改并实时显示的进度条 进度条,效果如下: 颜色.图标.节点什么的,都可以重新替换. 前端XAML代码: <UserControl x:Clas ...

随机推荐

  1. 速卖通api--获取商品信息

    <? $productId    = 'xxxx';//你的产品id    $access_token = 'xxxxx';//你的授权码    $appSecret    = 'xxxx';/ ...

  2. Windows phone 之样式的关联

    建议大家做界面要用Blend. 做过web的都知道DIV+CSS,给页面元素关联样式有三种方式: 1.内联样式表:就是在每个元素里面写style.优点就是灵活,给指定的元素添加样式.缺点是重用性很差, ...

  3. linux安装composer

    1,确保php已成功安装,并且php可以被访问php -r "copy('https://getcomposer.org/installer', 'composer-setup.php'); ...

  4. 【转】使用spring @Scheduled注解执行定时任务

    http://blog.csdn.net/sd4000784/article/details/7745947 以前框架使用quartz框架执行定时调度问题. 老大说这配置太麻烦.每个调度都需要多加在s ...

  5. OGNL学习-静态方法调用

    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/> 1.小写 & ...

  6. [BZOJ 3144] [Hnoi2013] 切糕 【最小割】

    题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...

  7. Servlet 中使用POI生成Excel

    使用的是poi3.13 http://mvnrepository.com/artifact/org.apache.poi/poi/3.13 import java.io.IOException; im ...

  8. Unity3D 命令行参数

    Unity3D 命令行参数 @by 广州小龙                                              unity ios开发群:63438968 Typically, ...

  9. Spring MVC 解读——@Autowired(转)

    转自:http://my.oschina.net/HeliosFly/blog/203902 Spring MVC 解读——@Autowired 一.@Autowired 作为一个Spring开发者对 ...

  10. 14.8.2 Role of the .frm File for InnoDB Tables InnoDB 表得到 .frm文件的作用

    14.8.2 Role of the .frm File for InnoDB Tables InnoDB 表得到 .frm文件的作用 Vsftp:/data01/mysql/zjzc# ls -lt ...