努力更新ProgressBar(无线程)

时间:2012-02-16 09:54:18

标签: c# winforms unresponsive-progressbar

我有一个程序(winform)在一个文件夹中运行很多文件(在400区域内),并显示其进度我使用进度条。如果这会产生影响,则会将信息发布到列表视图中。我遇到的问题是,当电脑很慢,我正在通过网络处理文件夹或者如果它是一个非常大的文件,ProgressBar只是停止更新。如果n离开程序,它将继续并完成,但进度条在某个阶段卡​​住了。然后只显示它是完整的(另外注意:我注意到这不仅仅是进度条。有时它是整个表单。但是,再一次,当程序完成时它很好。当它正在工作时你可以移动形式,只是不与它互动)

现在这里变得棘手。我知道它可以通过使用线程来解决。然而,我被告知不要使用它(让我们不要理解为什么,让它除了它,是否是愚蠢的)。我也尝试刷新表单,并刷新栏本身。似乎没有任何效果。使用它不是一个好主意,但即使尝试过.DoEvent,它也无法正常工作

如何让进度条更新?任何想法?

这里是我用于进度条的一些代码

//before the loop
progress = iCount1;
progressvalue = 0;
double increment = 100 / (double)progress;
//this is at the end of the loop
progressvalue = progressvalue + increment;

然后有一些代码。其中一些是为了阻止价值走出界限。其余的与进度条无关

编辑:o,我有1个变量。它基本上可以运行3个循环。这样我们就有一个连续的吧。不是酒吧运行3次

编辑:它似乎适用于我的电脑上的文件夹。但是当它在慢速PC或网络上运行时,就是这样做的时候

编辑:我得到关于后台工作者和线程的答案。没有线程,没有办法做到这一点吗?

更新:我终于说服我的老板用背景工作者来做。生病了。但对于这个问题,我猜.DoEvent答案是最好的

2 个答案:

答案 0 :(得分:1)

当表单线程繁忙时,它将非常无响应并且根本不绘制表单。即使你不想要线程,我认为你应该重新考虑..

我会在本例中使用backgroundworker:here这是一个非常简单的设置。

答案 1 :(得分:0)

然后可以添加Application.DoEvents()。

例如:

while(!end)
{ 

            //You processing logic here
            Application.DoEvents();
}

请注意,通常不鼓励这样做,因为它会破坏正常的事件流,并可能产生不可预测的结果。

http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx http://www.codinghorror.com/blog/2005/08/is-doevents-evil-revisited.html