簡體   English   中英

如何在調試時可靠地獲取Visual Basic .Net中的ComboBox.Text值?

[英]How can I reliably get ComboBox.Text value in Visual Basic .Net while debugging?

AFAIK這應該是一個非常簡單的任務,但經過兩次不同的嘗試后,我仍無法驗證Visual Basic .Net 4.5中ComboBox的當前值。

我怎樣才能可靠地獲得它? 我之前的2次嘗試詳細說明,以便您可以告訴我我的錯誤在哪里。

嘗試1(a):

在Visual Studio Express 2013中調試時嘗試從Watch窗口訪問MyComboBox.Text屬性。我在Watch Window中收到此消息,而不是檢索text屬性:

An exception 'Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException' occurred

這似乎是“正常”行為,解決方法在microsoft.com上的一篇有用的文章中有所描述[1]。

嘗試1(b):

如[1]中所述添加Control.CheckForIllegalCrossThreadCalls = False這一行並沒有幫助。 我將此行包含在我的表單代碼的New() Sub中,並通過將其作為表達式添加到監視窗口來驗證Control.CheckForIllegalCrossThreadCalls在運行時確實設置為False 行為沒有變化,我收到了與上面步驟1中列出的相同的錯誤消息。

嘗試2:

通過關注第一篇文章[1],我將以下代碼添加到我的表單模塊中:

Delegate Function GetBoardTextCallback() As String
Private Function GetBoardText() As String
    If Me.BoardBox.InvokeRequired Then
        Dim d As New GetBoardTextCallback(AddressOf GetBoardText)
        Return Me.Invoke(d)
    Else
        Return Me.BoardBox.Text
    End If
End Function

現在在我的Watch Window中,當我添加GetBoardText()會有大約5秒的延遲,然后在Value列中顯示一條消息,指出無法評估表達式,然后在表達式上點擊刷新后我收到此消息: Cannot evaluate expression because we are stopped in a place where garbage collection is impossible, possibly because the code of the current method may be optimized.

我是新來的代表,所以我懷疑我的實現有問題。 我必須承認,為什么簡單地閱讀表單元素的值需要如此復雜(即使視覺元素的單獨線程的概念看起來很簡單),我有點困惑。 我如何可靠地獲取(更不用說設置!)Visual Basic .Net中ComboBox的Text屬性,這種方式在我的Watch Window中調試時有效,並且(希望)也可以作為我可以在任何地方使用的表達式我的代碼?! 我是否必須為所有表單元素的每個get / set / element成員組合創建一個新的唯一委托函數? 請不!

編輯(嘗試2代碼驗證為線程安全):在進一步調查中,我已多次驗證我的代碼示例在嘗試2中確實有效,但在理解VS 2013調試器時必定存在一些重要錯誤。 如果監視窗口表達式失敗的原因是由於交叉線程問題,那么它們應該在調用我的線程安全getter時工作(畢竟,那些getter在運行時對其他線程工作得很好而沒有創建形式控制)。 那么調試器的線程有什么獨特之處呢?他們不能使用我寫的那些線程安全函數?! 解決這個問題確實是這個問題的答案。

編輯(調試工具中的錯誤?):另外,根據其他MS文檔[2],調試器中有調試多線程應用程序的工具。 但是 ,為所有可用線程添加監視表達式Me.BoardBox.TextGetBoardText()都會產生相同的結果。 這更有證據表明,調試器訪問線程內存或它的進程有一些奇怪/獨特的東西。 如果它只是“調試器正在查看錯誤的線程”類型問題,那么多線程調試選項應該已經修復了它。

[1] http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx [2] http://msdn.microsoft.com/en-us/library/ms164739.aspx

當您跨線程調試時,您將無法在另一個線程上獲取某些內容的值。 您的問題中顯示的Invoke方法將允許您的代碼從ComboBox獲取值,但在調試時不適用。

Visual Studio中的調試多線程應用程序

調試具有用戶界面的多線程應用程序可能特別困難。 在這種情況下,您可以考慮在另一台計算機上運行該應用程序並使用遠程調試。 有關信息,請參閱Visual Studio中的遠程調試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM