任务完成后才会显示进度条

时间:2009-04-01 14:20:56

标签: winforms multithreading

我一直在尝试将进度条设置为选取框以在另一个函数运行时继续移动。运行此功能后,我将显示消息(对于此示例)

我能够让这个工作的唯一方法是与后台工作者一起然后有一个

待办事项 循环直到在主窗体中运行的条件,直到操作完成,然后是我的消息框。

这似乎是一种完成此操作的kludge方法,一个thread.start后跟一个thread.join似乎是一个更好的方法来解决这个问题。但是,我也无法做到这一点。

如果有人有兴趣,我已经加入了一个小型演示程序。 http://www.filedropper.com/progressbar

由于

4 个答案:

答案 0 :(得分:6)

Thread.StartThread.Join 的方式 - 这基本上会再次阻止您的UI线程。 Application.DoEvents也不是要走的路 - 你真的想要一个单独的线程。

可以然后使用Control.Invoke / Control.BeginInvoke封送回UI线程,但BackgroundWorker使这一切变得更加容易。搜索“BackgroundWorker教程”会产生大量的点击。

编辑:要在工作人员完成时显示消息,请使用RunWorkerCompleted事件。 ReportProgress方法和ProgressChanged事件用于处理更新进度条。 (UI订阅了ProgressChanged,并且该任务定期调用ReportProgress。)

答案 1 :(得分:3)

这不是一个kludge。这是正确的做法; BackgroundWorker方法会发生什么?诀窍是使用ReportProgress方法将更改推送回UI(不要从工作者更新ProgressBar)。

答案 2 :(得分:1)

不时在您的函数中使用Application.DoEvents(),以便您的进程有一些时间来处理他的事件,包括重新绘制表单。

或者,您可以使用工作线程(如BackgroundWorker)来处理您的处理,而UI线程正在显示您的进度条。

答案 3 :(得分:1)

补充Marc Gravell给出的答案,BackbroundWorker有一个布尔属性WorkerReportsProgress,如果设置为false,当你调用ReportProgress时,程序将引发InvalidOperationException