【问题标题】:VB program free freezes but still responds?VB程序免费冻结但仍然响应?
【发布时间】:2017-06-21 16:45:27
【问题描述】:

我有一个用 Visual Studio 编写的 winforms 程序,用 Visual Basic 编码。

程序的主要部分是一个 while 循环,它发送串行命令、将数据写入 sql、执行基本算术并更新表单上的控件。我在后台工作人员执行工作子程序中有这个while循环,以便可以在后台工作人员子程序仍在运行时更新控件。运行一段时间后,我的表单将冻结,同时更新几个文本框。但是,后台工作程序继续运行,sql 数据仍然被写入,最奇怪的是,单击表单上的按钮会执行应有的操作,即使我们看不到该按钮被按下。

我想不出有什么会导致这样的行为,在视觉上表单被冻结,但所有控件仍然响应。

【问题讨论】:

  • 消防水管问题的迹象,从工作线程调用的速度超过了 UI 可以跟上的速度。从任务管理器中应该可以看到,您应该看到它正在燃烧 100% 核心。并且看到它使用越来越多的内存,最终导致您的程序崩溃。你必须走得慢一点。并且不要无休止地将文本附加到 TextBox,您必须不时将旧文本丢弃。
  • I have this while loop in a background workers do work sub so that the controls can be updated from the background worker sub 这不是它应该如何工作的。在 BGW 上执行工作并仅从 UI 线程更新 UI。 BGW 包含用于报告进度的方法和事件

标签: vb.net winforms visual-studio


【解决方案1】:

它冻结是因为 UI 线程正忙于循环。看来您没有正确实现后台工作程序,它仍然附加到 UI 线程。

您可以在循环中的某处添加DoEvents,这样可以给 UI 线程一些时间来处理 UI 事件。但这只是一个创可贴修复,因为我不知道你的代码。理想的方法是修复后台工作线程及其与 UI 线程的关系。

【讨论】:

  • 您能详细说明一下吗? DoEvents 有什么作用,为什么你认为它可以帮助我解决这个问题?
  • 永远不要使用 DoEvents。为您的代码实施适当的后台/线程解决方案。 @JonW
  • 我已将 application.doevents 行添加到我的 while 循环中,并让它运行以对其进行测试。确定后台工作线程和 ui 线程之间问题的最佳方法是什么?如何解决?
  • DoEvents 应该被弃用,并且以DoEventsAndIntroduceReentrancyBugsAndDeadlocks 的名义发布相同的功能。
  • DoEvents 解决了这个问题,就像在办公室着火时闭上眼睛让你继续工作一样。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多