2 dearwangzong dearwangzong 于 2013.11.14 23:05 提问

C#进度条能否根据代码的执行进度来加载进度?

我在网上搜索了下资料,大部分都是使用Timer控件或者线程来进行,但是最终都是根据计算结果来写出一个MaxValue和一个Value来计算并且填充进度条
但是计算的话总感觉不是很准确,我如今遇到了一个比较棘手的难关(对于我而言),有个界面的树在读取数据库进行绑定的时候会显得非常慢,但是设定进度条的时间长短根本无法确定,以及代码例如(链接TCP之类的)断开链接也会产生卡主的状况,但是由于线程的关系,进度条依然显示完毕了。
使得我非常的头疼,因此我想问问,有没有办法获取代码的执行进度,根据代码的总执行次数和现在执行的行数来填充进度条?

或者看到这个问题的您能给我一种更加好的方案呢?希望能被解答下。

2个回答

caozhy
caozhy   Ds   Rxr 2015.04.13 13:53

不可能,一个程序除非执行完成,否则不可能知道自己需要多久能执行完成。进度只能估算。

在计算机刚刚发明的时候,数学家就考虑过和你相似的问题,他们想,一些数学命题可以用穷举法来试图证明一些数学猜想,比如歌德巴赫猜想,这个在中国家喻户晓。
说的是“任一大于2的整数都可写成两个质数之和。”。因此,我们可以写一个程序,从2开始往上穷举,对每个数都分解质因数,如果遇到“不能写成两个质数之和“,程序停止。
这个程序想必再菜鸟的程序员也能写出来。我们不关心这个程序执行需要多久,也不关心用什么性能的计算机,我们的问题是,这个程序会不会停止,有没有确定的执行时间?
假设我们不通过执行一个程序,知道它的执行时间(或者它会永远执行而不停止),有这种方法存在,那么是不是这类数学难题都解决了?如果我们能推算出程序一直执行而不停止,岂不是证明了哥德巴赫猜想?
不过很遗憾,这种方法是不存在的。这就是计算机科学上著名的停机问题。,

u011623102
u011623102   2015.04.13 13:45

不知道能不能在一开始就获取树中节点的数量。
如果可以的话,可以使用System.ComponentModel.BackgroundWorker控件,这个控件可以用来做前后台进度显示。
将BackgroundWorker控件的属性WorkerReportsProgress设置为True,之后调用控件的ReportProgress函数就会触发ProgressChanged事件。
ProgressChanged事件中参数ProgressChangedEventArgs e,e.ProgressPercentage就是你之前ReportProgress函数中填写传递的数。
如此就可以在ProgressChanged事件中去更新进度条了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!