首页 新闻 会员 周边

关于ProgressBar的机制问题

0
悬赏园豆:20 [已解决问题] 解决于 2013-06-27 22:33

进度条控件底层有特殊的东西吗?

有这个疑惑的原因是因为这样一个例子:比如我进行一个比较费时的操作,比如循环读入并写入一个大文件,就在窗体的某个事件里写,此时在while循环里每次把进度赋值给进度条的value属性,同时也赋给一个lable控件。那么程序在运行的时候,程序界面上进度条确实是实时更新显示,并没有因为程序卡而阻塞,而lable则完全不动了知道程序读写完毕,才直接显示最后一个值。

请问为什么有这种现象呢?进度条控件底层有什么特别之处吗?

老箫的主页 老箫 | 初学一级 | 园豆:188
提问于:2013-06-27 00:07
< >
分享
最佳答案
0

你把数字调大点

for (int i = 0; i < 10000; i++)
{
progressBar1.Value = i;
label1.Text = i.ToString();
}

可以观察到progressBar1的增长并不是匀速的,如果要实现匀速,可以简单的这样写

for (int i = 0; i < 10000; i++)
{
progressBar1.Value = i;
label1.Text = i.ToString();
Application.DoEvents();
}

其实也就是说你被ProgressBar忽悠了,直接用并不是异步的,不是匀速也说明你看到的ProgressBar进度不是很准的执行进度,你可以理解为它的“刷新频率比label高了”

事实上如果你要准确的使用ProgressBar,还需要异步调用http://www.cnblogs.com/SkySoot/archive/2012/04/05/2433205.html

收获园豆:12
WuRang | 小虾三级 |园豆:1730 | 2013-06-27 09:32
其他回答(1)
0

应该是 ProgressBar 是异步的, 你给他的value 付了值 就会引起 valuechanged 事件 , 再加上他是子线程异步 就是实时更新 UI。  而label 是同步的,当前线程正在执行耗时操作, 他会等

收获园豆:8
kotl | 园豆:5 (初学一级) | 2013-06-27 08:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册