在 C# 中重写 Application.Doevents(),以便在调试模式下禁用它

本文关键字:调试 模式 重写 Application Doevents | 更新日期: 2023-09-27 17:57:15

我正在调试一个从 vb6 移植的应用程序。它到处都是应用程序事件,除了我进入调试器时,这很好。一旦我跨过 Application.DoEvents() 控件就会转移到某个随机区域,这取决于消息泵中挂起的内容。如何在应用程序级别的一个地方优雅地覆盖此方法,使其像这样工作(伪代码)

protected override void Application.Doevents()
{
  if (!Debugger.IsAttached)
     Application.Doevents()
}  

无需 #ifdef 调试到处都是。谢谢

在 C# 中重写 Application.Doevents(),以便在调试模式下禁用它

没有必要 -

或不可能 - 覆盖它。
只需创建一个包含静态方法的静态类,然后将您想要的代码放入其中。将所有调用更改为Application.DoEvents更改为对该静态方法的调用。

您无法覆盖它。这是一种静态方法。但是,您可以轻松地编写自己的类,并将所有当前对Application.DoEvents的调用替换为 CustomApplication.DoEvents ,例如。

(就我个人而言,我认为应用程序首先充斥着DoEvents调用并不"好",但那是另一回事。

它到处都是应用程序事件,除了我进入调试器时,这很好。

不,这不行。 未连接调试器,未连接调试器。您提出的解决方案是错误的。您需要完全消除它,而不仅仅是在调试模式下隐藏它,这是您最有可能注意到由此产生的错误和副作用的时候。

执行全局搜索和替换,并注释掉调用该函数的每一行。然后调试生成的代码,找出它中断的位置以及需要执行的操作来修复它。

提示:不要在 UI 线程上执行长时间运行或占用大量 CPU 资源的任务。为此剥离一个单独的线程。BackgroundWorker组件是一种非常方便的方式,即使对于还不习惯使用多个线程的人来说也很舒适。

Application.DoEvents是一个等待发生的错误。不要让它咬你。你在调试器中看到的令人沮丧的行为与应用代码中一直发生的情况完全相同无论您做什么,都不要将包含调用的代码交付到尚未彻底调试的Application.DoEvents

将覆盖的定义放在调试 #ifdef。