2011-05-31 91 views
10

一些背後的故事:的Windows窗體ComboBox造成間歇System.AccessViolationException

我尋覓既計算器和谷歌要弄清楚這個特定的異常原因。

我們有一個Windows Forms(C#,.NET 2.0)應用程序偶爾會拋出System.AccessViolationException(下面的堆棧跟蹤)。在Windows XP(SP3)和Windows Vista(SP2)上都發生異常。從用戶輸入中,我們已經確定當ComboBox的選定索引更改時發生異常。

ComboBox是一個標準的Windows窗體組件,它包含在繼承System.Windows.Forms.UserControl的自定義控件中。

我的主要查詢是:

如果這個異常是從哪裏來的?

  • 它是從.NET框架中的一些內部錯誤?
  • 它可能是在SelectedIndexChanged事件中分派的代碼嗎?在計算器

相關主題:

堆棧跟蹤:

Message: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
Type: System.AccessViolationException 

    at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at System.Windows.Forms.NativeWindow.DefWndProc(Message& m) 
    at System.Windows.Forms.Control.DefWndProc(Message& m) 
    at System.Windows.Forms.Control.WmCommand(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ComboBox.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

回答

1

我有這些問題還有,回來的路上,當我使用.NET 2.0的WinForms。我似乎記得微軟爲此發佈了一個修補程序。我搜索了它,發現了這兩個。你可以試試它們。

http://support.microsoft.com/kb/923028

http://support.microsoft.com/kb/971030

而且,你有沒有安裝.NET 2.0的所有服務包?

+0

感謝您的回覆@rewinder。實際上,第二個鏈接可能很有趣。然而,應用修補程序/服務包是我們儘可能避免的,將應用程序安裝在數百臺機器上。我目前正在調查組合框是否被改變,同時GUI線程對它做了一些工作 - 一個傳言說組合框的底層實現不完全是線程安全的。 – Christoffer 2011-05-31 13:15:51

+0

@Christoffer:好的。那麼,讓我知道你是否找到任何東西。 – 2011-05-31 13:20:22

+1

在Microsoft支持部門發現另一個有點相關的主題:http://support.microsoft.com/kb/952544但我沒有使用任何自動完成功能。但是,可以將項目添加到Items集合OnKeyDown或OnSelectedIndexChanged。我不知道這是否會導致問題,我會繼續調查。 – Christoffer 2011-06-01 08:54:56

-1

不要讓它有機會超載內存,處置所有新的和未使用的項目/控件 不要在線程操作期間不斷地向列表框中添加/刪除對象。

如果不清除內存,則會發生GDI問題。

發生Combobox異常,它可能與selecteditem有關,無論該項目是存儲文本還是整數。 文本必須是文本,整數必須是整數。

+0

這不回答這個問題。如果可能,請適當修改您的答案。 – 2012-11-09 05:48:57