【问题标题】:Windows Forms ComboBox causing intermittent System.AccessViolationExceptionWindows 窗体组合框导致间歇性 System.AccessViolationException
【发布时间】:2011-09-05 08:19:34
【问题描述】:

一些背景故事:

我已经搜索了 stackoverflow 和 Google,以找出这个特定异常的来源。

我们有一个 Windows 窗体(C#、.NET 2.0)应用程序,它偶尔会抛出 System.AccessViolationException(下面的堆栈跟踪)。在 Windows XP (SP3) 和 Windows Vista (SP2) 上都发生了异常。根据用户输入,我们已经确定当 ComboBox 的选定索引发生更改时会发生异常。

ComboBox 是标准的 Windows 窗体组件,它包含在继承 System.Windows.Forms.UserControl 的自定义控件中。

我的主要查询是:

这个异常从何而来?

  • 是来自 .NET 框架中的一些内部错误吗?
  • 会不会是在 SelectedIndexChanged 事件上调度的代码导致了它?

stackoverflow 上的相关主题:

堆栈跟踪:

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)

【问题讨论】:

    标签: c# winforms exception-handling combobox .net-2.0


    【解决方案1】:

    当我使用 .net 2.0 WinForms 时,我也遇到过这些问题。我似乎记得微软为此发布了一个修补程序。我google了一下,找到了这两个。你可以试试。

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

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

    另外,您是否安装了所有适用于 .NET 2.0 的 Service Pack?

    【讨论】:

    • 感谢@rewinder 的回复。第二个链接实际上可能很有趣。但是,我们会尽可能避免应用修补程序/服务包,将应用程序安装在数百台机器上。我目前正在调查组合框是否被更改,同时 GUI 线程对其进行了一些工作——有传言称组合框的底层实现不是完全线程安全的。
    • @Christoffer:好的。好吧,如果你发现了什么,请告诉我。
    • 在 Microsoft 支持部门找到了另一个相关主题:support.microsoft.com/kb/952544 但我没有使用任何自动完成功能。但是,可以将项目添加到项目集合 OnKeyDown 或 OnSelectedIndexChanged。我还不知道这是否会导致问题,我会继续调查。
    【解决方案2】:

    不要给它一个超载内存的机会,处理所有新的和未使用的项目/控件 不要经常在列表框中添加/删除对象,通常是在线程操作期间。

    如果不清除内存就会出现 GDI 问题。

    发生组合框异常时,它可能与所选项目相关,无论该项目是否存储了文本或整数。 文本必须是文本,整数必须是整数。

    【讨论】:

    • 这没有回答问题。如果可能,请适当修改您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多