使用c#中的完成消息框同步进度条"填充"

rle*_*mon 3 c# winforms

我有一个Thread处理二进制文件并将其存储在数据表中.处理时我正在使用当前流位置更新进度条.我的问题是; 在线程中我有一个finally {}块,并且我将progressbar值设置为最大允许值,然后我运行Application.DoEvents();然后我显示一个MessageBox,但我的MessageBox总是出现在Progressbar填充之前.

问题

这是适用的代码

这是一个显示问题的视频

我创建了一个小应用程序来演示使用BackgroundWorker而不是Thread.这是代码

我看到了相同的'错误'(我犹豫不决称这是一个错误,更多的是可用性问题)正如你所看到的,我还在那里添加了一个脏的小记录器.日志文件末尾的输出是:

27/10/2011 4:58:29 PM - 进入进度

27/10/2011 4:58:29 PM - 进度改为79661

27/10/2011 4:58:29 PM - 进入进度

27/10/2011 4:58:29 PM - 进度改为79661

27/10/2011 4:58:29 PM - 完成输入

27/10/2011 4:58:29 PM - 活动完成

27/10/2011 4:58:30 PM - 显示消息

因此,执行命令的顺序没有问题...是我在显示消息框之前添加延迟的唯一真正解决方案吗?

Jos*_*hua 5

我会尝试用Application.DoEvents();简单的替换Thread.Sleep(100).周围的文档DoEvents似乎并不表示是否允许您从另一个非UI线程调用它.Thread.Sleep相反,通过使用,您将延迟消息框弹出窗口并允许UI线程正常处理.

让工作者背景弹出消息框的另一种方法是使用事件,并在UI线程上调用已订阅的委托(就像您对进度条所做的那样).

实际上,如果您愿意,您可以重写线程代码以使用BackgroundWorker对象,并订阅ProgressChangedRunWorkerCompleted事件.您的实际线程代码将负责调用ReportProgress触发ProgressChanged事件以更新进度条的方法.

对更新的回应

查看新代码后,在工作人员完成时,您永远不会将进度条设置为最大值.在显示消息框之前worker_RunWorkerCompleted添加progressBar1.Value = progressBar1.Maximum;.这应该在弹出消息框之前将进度条更新到最大值.