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

Winforms 任务完成后才显示进度条,winforms,multithreading,Winforms,Multithreading,我一直在尝试将progressbar设置为marquee,以便在另一个函数运行时保持移动。此函数运行后,将显示I消息(对于本例) 我能让这项工作正常进行的唯一方法是找一名背景工作人员,然后进行一次 做 循环直到在主窗体中运行的条件,直到操作完成,然后是我的消息框 这似乎是一种很难实现的方法,而thread.start后跟thread.join似乎是解决此问题的更好方法。然而,我也没能让它工作 我已经包括了一个小的演示程序,如果有人感兴趣。 感谢您不时在函数中使用Application.DoEv

我一直在尝试将progressbar设置为marquee,以便在另一个函数运行时保持移动。此函数运行后,将显示I消息(对于本例)

我能让这项工作正常进行的唯一方法是找一名背景工作人员,然后进行一次

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

这似乎是一种很难实现的方法,而thread.start后跟thread.join似乎是解决此问题的更好方法。然而,我也没能让它工作

我已经包括了一个小的演示程序,如果有人感兴趣。

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


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

线程。启动
线程。加入
不是这样做的方法-基本上再次阻塞您的UI线程
Application.DoEvents
也不是一个好办法——你真的需要一个单独的线程

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


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

这不是一个难题。这是正确的做法;BackgroundWorker方法会发生什么?诀窍是使用
ReportProgress
方法将更改推回到UI(不要从worker更新
ProgressBar

补充Marc Gravel给出的答案,BackRoundWorker具有布尔属性WorkerReportsProgress,如果在调用ReportProgress时将其设置为false,程序将引发InvalidOperationException

我的do循环中已经有了该异常。我想我可能需要使用delagate并调用该方法。请参阅我的示例我当前正在使用后台工作程序,但必须使用do application.doevents循环等待后台工作程序进程完成,直到出现错误。为什么必须等待进程完成?您希望您的UI线程能够自由响应事件(例如,您的窗口被重新绘制)。Jon,“等待任务完成”通常是一个问题-我们都同意您不能阻止消息泵线程,但通常有更高级别的应用程序要求,在这一操作完成之前,不允许启动其他操作。模态进程对话框规则,也许…@Will:是的,我的评论写得很匆忙。我想应该是:“我想你错过了RunWorkerCompleted事件”:)我最终使用了RunWorkerCompleted。我将不得不对一些功能进行一些重大的重新设计。但我相信它看起来比do loop的东西好多了,而且我晚上能睡得更好。只希望我能创建自己的后台线程,只做一个thread.join.progresss条是一个标记,我一直认为后台工作程序主要用于异步进程。但是我需要停止主程序(除了品牌运行),直到进程完成。请参见示例代码缺失。使这个问题更难理解。