2011-05-23 25 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