2011-05-23 80 views
1

我正在调试从vb6移植的应用程序。它有Application.Doevents散布在整个地方,除了当我正在调试器中进行时,情况良好。只要我跨过一个Application.DoEvents()控件,就会根据消息泵中的待处理内容将其转移到某个随机区域。我怎样才能优雅地在一个地方在应用程序级别重写此方法,所以它的工作原理是这样的(伪代码)覆盖C#中的Application.Doevents(),以便在调试模式下禁用

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

没有把#ifdef来DEBUG的所有的地方。 谢谢

回答

2

没有必要 - 或者不可能 - 重写它。
只需用静态方法在其中创建一个静态类,并将您想要的代码放在里面。将所有呼叫更改为Application.DoEvents以调用该静态方法。

+0

感谢你和Jon Skeet的类似答复。将根据您的建议做。 – Gullu 2011-05-23 15:25:17

-1

将覆盖的定义放在#ifdef DEBUG中。

1

你不能覆盖它。这是一种静态方法。但是,例如,您可以轻松编写自己的班级,并使用CustomApplication.DoEvents将当前的所有呼叫替换为Application.DoEvents

(我个人不认为这是与在首位DoEvents调用中夹杂的应用程序“精”,但是这是一个不同的问题。)

+0

我能否将您的答案标记为正确?不知道如何标记两个答案是正确的。谢谢 – Gullu 2011-05-23 15:34:07

1

它Application.Doevents散落各地除了当我正在进入调试器时,这个地方很好。

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

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

提示:不要在UI线程上执行长时间运行或CPU密集型任务。为此分开一个单独的线程。 BackgroundWorker component是一个非常方便的方法,即使对于不熟悉多线程的人也很舒服。

Application.DoEvents是一个等待发生的错误。不要让它咬你。在调试器中看到的令人沮丧的行为是,正好与发生的事情相同全部应用程序代码的内部时间。并且不管你做什么,请勿将包含调用的代码发送到Application.DoEvents那你还没有彻底调试过。

+0

这有点夸张。 'DoEvents()'是(几乎总是)邪恶的,但是如果你继承了一个有很多调用的代码库,并且它正在工作,那么就让它一个人待着吧。 – 2011-05-23 14:01:44

+0

@亨克 - 我不认为这是夸张的。更重要的是,在调试模式下禁用它,但在释放模式下启用它显然是错误的解决方案。这只是一个等待发生的灾难,像那种尚未彻底调试的代码一样。这个问题只有一个真正的解决方案。 – 2011-05-23 14:03:41

+0

@Cody:调试!=测试。这是工作代码,因此重新修订最佳实践的重大改革只是愚蠢的。 – 2011-05-23 14:10:10