加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:48:31 所属栏目:百科 来源:网络整理
导读:我有一个Thread处理二进制文件并将其存储在数据表中. 处理时我正在使用当前流位置更新进度条. 我的问题是;在线程中我有一个finally {}块,并且我将progressbar值设置为最大允许值,然后我运行Application.DoEvents();然后我显示一个MessageBox,但我的MessageBo
我有一个Thread处理二进制文件并将其存储在数据表中.
处理时我正在使用当前流位置更新进度条.
我的问题是;在线程中我有一个finally {}块,并且我将progressbar值设置为最大允许值,然后我运行Application.DoEvents();然后我显示一个MessageBox,但我的MessageBox总是出现在Progressbar填充之前.

here is the applicable code

here is a video showing the issue

我创建了一个小应用程序来演示使用BackgroundWorker而不是Thread. Here is the code

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

27/10/2011 4:58:29 PM – Progress Entered

27/10/2011 4:58:29 PM – Progress Changed to 79661

27/10/2011 4:58:29 PM – Progress Entered

27/10/2011 4:58:29 PM – Progress Changed to 79661

27/10/2011 4:58:29 PM – Complete Entered

27/10/2011 4:58:29 PM – Events Done

27/10/2011 4:58:30 PM – Message Shown

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

解决方法

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

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

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

对更新的回应

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读