我有一个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 - 显示消息
因此,执行命令的顺序没有问题...是我在显示消息框之前添加延迟的唯一真正解决方案吗?
我会尝试用Application.DoEvents();简单的替换Thread.Sleep(100).周围的文档DoEvents似乎并不表示是否允许您从另一个非UI线程调用它.Thread.Sleep相反,通过使用,您将延迟消息框弹出窗口并允许UI线程正常处理.
让工作者背景弹出消息框的另一种方法是使用事件,并在UI线程上调用已订阅的委托(就像您对进度条所做的那样).
实际上,如果您愿意,您可以重写线程代码以使用BackgroundWorker对象,并订阅ProgressChanged和RunWorkerCompleted事件.您的实际线程代码将负责调用ReportProgress触发ProgressChanged事件以更新进度条的方法.
查看新代码后,在工作人员完成时,您永远不会将进度条设置为最大值.在显示消息框之前worker_RunWorkerCompleted添加progressBar1.Value = progressBar1.Maximum;.这应该在弹出消息框之前将进度条更新到最大值.
| 归档时间: |
|
| 查看次数: |
1366 次 |
| 最近记录: |