2010-05-18 55 views
0

我正在使用C#.net,Windows应用程序,我想使用按钮中的Progressbar而不使用BackGroundworker,任何人都可以建议,在此先感谢....... .............,我试过使用线程,For循环迭代,如何在按钮中使用Progressbar而不使用BackGroundworker

+0

你能详细阐述一下你想达到的更多的东西吗?通过给定的细节,我得到你想显示进度条上点击一个按钮,我是正确的! – Malcolm 2010-05-18 07:22:35

回答

2

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

较长的答案是:

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

但是,这在实践中并不奏效。原因是当你在你的循环中时,你的应用程序是“繁忙的”,并且它不响应来自操作系统的窗口消息。操作系统会注意到这一点,并决定你没有反应,所以它会拍摄一个窗口的快照。从那时起,无论何时更新进度条,操作系统都会显示快照而不是当前状态,因此就用户而言,进度条移动到(例如)35%,然后刚刚“卡住” 。这完全击败了进度条!

要解决这个问题,您的UI线程必须处理消息。有两种方法可以完成。

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

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

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