我正在开发一个遗留应用程序,它到处都有 Application.DoEvents。我完全意识到,由于重入问题,这是不赞成的,但重构目前不是一种选择。
DoEvents 永远不会退出的问题已经开始出现。UI 是响应式的(我可以在用户日志中看到 UI 线程活动),因此 DoEvents 似乎正在发送消息,但由于某种原因它永远不会完成。不幸的是,这个 DoEvents 在主要的数据处理组件中,这意味着它会停止处理服务器响应,因为它卡在 DoEvents 行上。
我们有 Stopwatch 跟踪,它告诉 DoEvents 运行了多长时间 - 令人惊讶的是,我得到了一个日志,它说它运行了 188267770 毫秒,即 52 小时(gulp)。它似乎在星期六凌晨 3 点左右进入这种状态,直到用户在星期一进来并关闭应用程序(没有杀死进程,我可以看到 GUI 线程跟踪优雅地关闭事物),此时 DoEvents 完成并记录计时器数据(因此关闭期间发生的某些事情必须说服 DoEvents 完成)。
当然,这只发生在生产用户的机器上,而不是我的开发盒:)
有没有人见过类似的问题?
我已经反编译了 DoEvents 以及 Conrol.BeginInvoke 如何使用 Windows 消息队列将方法委托推送到 GUI 线程,但我看不到 DoEvents 如何像这样卡住,并保持 UI 响应。
源代码控制差异也不是一个选项,因为自用户拥有的最后一个“好”版本以来已经有大约 30 个版本,而这个新版本存在问题 - 所以大约 200 个文件已更改。
非常感谢保罗