如何在按钮中使用进度条单击没有BackGroundworker

时间:2010-05-18 07:18:20

标签: c#-2.0

我正在使用C#.net,Windows应用程序,我想在没有BackGroundworker的Button Click中使用Progressbar,任何人都可以建议,在此先感谢................ ....,我尝试使用线程,For循环迭代,

1 个答案:

答案 0 :(得分:2)

快速回答非常接近“你做不到”。

答案越长越好:

理论上你可以简单地启动一个进度条,然后在for()循环中更新它。

然而,这在实践中并不能很好地发挥作用。原因是,当您处于循环中时,您的应用程序“忙碌”,并且它不会响应来自操作系统的Windows消息。操作系统会注意到这一点并确定您没有响应,因此它会拍摄窗口的快照。从那时起,无论何时更新进度条,操作系统只显示快照而不是当前状态,因此就用户而言,进度条移动到(例如)35%然后才“卡住” 。这完全违背了进度条的意思!

要解决此问题,您的UI线程必须继续处理消息。有两种方法可以做到。

1)为处理作业使用单独的线程,并要求UI线程更新进度条。这是“背景工作者”方法,它运作良好。

2)您可以在固定的for()循环中调用Application.DoEvents()。这允许在您“忙”时分派消息,从而避免出现问题。但是,这是极其危险的,因为处理消息会导致对代码的重新调用(例如,如果单击“开始”按钮开始处理,用户将能够再次单击“开始”,您将尝试执行此操作处理过程中的一些处理)。要解决此问题,您必须非常小心,安装MessageFilter以确保您只在此上下文中处理“安全”消息。除非你真的知道自己在做什么,否则不要尝试这种方法。

因此,只留下一种实用方法:使用BackgroundWorker(或您自己的线程)。有很多关于如何在网上做这个的教程,所以我不会在这里详细说明这个方法。