2012-01-05 44 views
3

我前一陣子重構我的應用程序,從那時起我一直在使用Visual Studio 2010中應用只掛斷點被觸發時,.NET,C#,Visual Studio中

我的應用程序按預期工作具有調試問題而不是而不是調試(不通過應用程序,附加的調試器不會導致任何問題)。但是,當觸發斷點時,我開始瀏覽應用程序,Visual Studio和應用程序在最多3-4步後都會掛起。
更加強調這一點:它與我的客戶一起工作良好,無論是從Visual Studio開始還是獨立開展工作 - 只要沒有觸發任何中斷點。
無論我在代碼中放置斷點的位置如何。

IDE:Visual Studio 2010中的x64
平臺:.NET 4.0

重構包括了許多跨線程調用來BeginInvoke - 通過以下方式全渠道:

public static void BeginInvokeIfRequired(this Control control, Action action) 
{ 
    if (control.InvokeRequired) 
    { 
     control.BeginInvoke(action); 
    } 
    else 
    { 
     action.Invoke(); 
    } 
} 

有在項目中不需要致電Control.Invoke()

  • 上述方法有問題嗎?

此外,我會很感激任何提示你如何追蹤這個錯誤。我目前的做法是將輸出添加到控制檯並選擇性地停用部分代碼。

+1

嗨! :)幾乎可以肯定,這個問題是多線程相關的......你有任何類型的線程等待/鎖定的東西,可能會導致循環死鎖? – 2012-01-05 08:31:34

+0

@DarylTeo在部分代碼中沒有鎖定。唯一的鎖定語句在啓動後立即執行 – yas4891 2012-01-05 08:39:17

+0

多線程,編輯並繼續。 ThreadPools它的奇蹟它的作用(大部分時間)。有時候,解決方案和代碼的複雜性只會影響視覺工作室。我注意到一些第三方組件簡單地打破了這種類型的代碼,它甚至可能是一些重新編寫的代碼打破調試器等。 – CodingBarfield 2012-01-05 10:25:49

回答

0

我懷疑在某些情況下,由於InvokeRequired在於IsHandleCreatedfalse - 即使您不在GUI線程上,它也會返回false,因此您顯示的代碼會造成問題。

僅供參考,請參閱http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx

下面的代碼會拋出一個異常,而不是掛起......當沒有中斷點時,它「按預期工作」這一事實可能是調試器凍結所有線程而達到斷點的結果,這反過來可能導致一個不同的執行順序等。

總而言之,您的代碼中可能會有一些「競爭條件」,其中BeginInvokeIfRequired在該控件具有Handle之前在新創建的控件上調用。這甚至可以是您使用的一些第三方代碼...

public static void BeginInvokeIfRequired(this Control control, Action action) 
{ 
    if (control.IsHandleCreated) 
    { 
     if (control.InvokeRequired) 
     { 
      control.BeginInvoke(action); 
     } 
     else 
     { 
      action.Invoke(); 
     } 
    } 
    else { 
     // in this case InvokeRequired might lie ! 
     throw new Exception ("InvokeRequired is possibly wrong in this case"); 
     } 
} 
+0

非常感謝您的答案。這隻適用於如果我初始化後創建了一個'Control' - 對嗎?不幸的是,我不會在運行時創建任何控件(在'InitializeComponents()'之後)。我只是改變了'Visible'屬性 – yas4891 2012-01-05 08:57:56

+0

@ yas4891不是真的,甚至創建的控件可能處於'Handle'尚未創建的狀態......和一些第三方庫(過去例如Infragen ...)創建用於內部使用(如測量的東西)的不可見控制... – Yahia 2012-01-05 09:01:41

+0

我已經添加控制檯輸出到BeginInvokeIfRequired,以防手柄未被創建。我只在啓動期間得到輸出。我不使用第三方庫(除非你認爲MSChart是第三方庫) – yas4891 2012-01-05 13:37:12

相關問題