我一直在尝试将进度条设置为选取框以在另一个函数运行时继续移动。运行此功能后,我将显示消息(对于此示例)
我能够让这个工作的唯一方法是与后台工作者一起然后有一个
待办事项 循环直到在主窗体中运行的条件,直到操作完成,然后是我的消息框。
这似乎是一种完成此操作的kludge方法,一个thread.start后跟一个thread.join似乎是一个更好的方法来解决这个问题。但是,我也无法做到这一点。
如果有人有兴趣,我已经加入了一个小型演示程序。 http://www.filedropper.com/progressbar
由于
答案 0 :(得分:6)
Thread.Start
和Thread.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