C# 使用应用程序的奇怪崩溃

C# 使用应用程序的奇怪崩溃,c#,winforms,visual-studio-2010,debugging,C#,Winforms,Visual Studio 2010,Debugging,我开发了一个应用程序。直到最近,它还工作得很好,但有时会出现以下错误,然后崩溃。没有发生错误的行号或其他信息,因此我不确定要查找什么: See the end of this message for details on invoking just-in-time (JIT) debugging instead of this dialog box. ************** Exception Text ************** System.NullReferenceExcep

我开发了一个应用程序。直到最近,它还工作得很好,但有时会出现以下错误,然后崩溃。没有发生错误的行号或其他信息,因此我不确定要查找什么:

 See the end of this message for details on invoking 
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Windows.Forms.ListView.OnHandleCreated(EventArgs e)
   at System.Windows.Forms.Control.WmCreate(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ListView.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)
有什么线索或想法吗?基本上,这是一个刮板和海报有时它会超过80k,工作得很好,并完成一些时间,它给出的错误如上所述

如果有人遇到过类似的问题,请告诉我,因为我显然无法找到原因

更新

我能想到的一个原因是该工具在表单上有大约10个
Listview
控件,它存储信息并显示大约所有超过50k的信息。但是有时候它会超过80k,有时候它会弹出1k的错误。这是完美的工作,我从来没有看到这个错误超过5-6个月。这才刚刚开始

更新

我刚刚注意到的另一件奇怪的事情是,当我在任何地方点击机器人时:这个错误会在一段随机时间后弹出。所以我不确定它到底出了什么问题。假设我有一个
列表视图
,当我进入其中查看URL时,我看到如下错误,其他人工作正常,然后单击任意位置会出现此错误

在搜索过程中,我也发现了这个。这完全符合我在
tabcontrol
中的场景
Listview
,它在这里指出这是一个bug

这就是我插入到
列表视图的方式:

           ListViewItem item1 = new ListViewItem(url, 0);
              if (listView1.InvokeRequired)
                 {
                   listView1.Invoke(new MethodInvoker(
                      () =>
                   listView1.Items.AddRange(new ListViewItem[] { item1 })
                                        ));
                 }
              else
                {
                  listView1.Items.AddRange(new ListViewItem[] { item1 });
                }

谢谢。

根据您提供的信息,我只能说您正在尝试访问一个对象,该对象可能已被处置或删除,无论是有意还是无意,通常NullReferenceException在Visual Studio内部调试时很容易查找。查找在给定情况下试图从可能为空的对象读/写的任何代码段。

要找出错误发生的位置,可以(通常)使用“异常中断”让调试器在错误发生的代码行停止。(使调试变得容易得多,但如果在错误停止时正确处理了大量错误,则可能会很烦人)

  • 要打开它,请打开“调试”菜单并单击“异常…”(快捷方式为Ctrl+D+E)
  • 激活“抛出”列中的“公共语言运行时异常”
  • 单击“确定”并再次启动应用程序,然后让错误发生。现在,调试器将在找到它的代码行(可能)处停止

  • 查看stacktrace:

    System.Windows.Forms.ListView.OnHandleCreated(EventArgs e)
    
    这是框架代码。这不是您的代码。从堆栈根到崩溃的所有内容都在框架中。这几乎没有说明原因,对不起

    根据我的经验,在OnHandleCreated期间发生崩溃并不容易。我看过几次,通常是因为:

    • 另一些线程在完全不同的代码部分竞争
    • 某些eventhandler在窗体关闭或释放期间尝试重新加载/构建UI
    • 某些eventhandler尝试在窗体正常启动之前重新加载/构建UI
    • 写得不好的P/Invoke代码(试图“破解”控件以实现一些非标准的外观或行为)
    我已经在反编译器中查看了
    ListView.OnHandleCreated
    ,但我没有注意到有任何简单的方法可以在那里获取null引用。。例如,在其
    .Items
    .columnHeaders
    中有一个
    null
    可能会影响到它,但是在那里有一个null并不是那么容易,因为ListView在内部管理这些集合。但是,我没有看到任何锁,所以如果发生线程争用,可能就是它

    它是一个普通的ListView,还是您对它进行了子类化并重写了某些内容

    编辑:

    创建的OnHandle很奇怪。。默认情况下,在控件第一次可见时创建句柄。如果您有任何显示/隐藏行为,并且在线程启动时表单启动时ListView不可见,那么问题可能非常微妙

    OnHandleCreated是来自控件实现本机部分的回调。我在代码中没有看到任何锁/同步器。如果ListView的实际初始化被延迟,并且线程开始泵送数据,那么我猜可能本机回调与您的工作线程将一个新数据项推送到项中的竞争

    尝试强制更早、更早地创建ListView的句柄。找到InitializeComponent函数,并在其后面添加一个伪行,在线程开始之前添加一个伪行:

    myFormConstructor()
    {
        InitializeComponent();
        var foo = myListView.Handle;
    
        onlyNowStartTheThreads();
    }
    

    它将导致应用程序立即开始创建句柄,并等待它完成。我不确定确切的比赛点,但它至少排除了这种可能性。

    您向我们显示了一条空参考错误消息,但没有向我们提供有关您的代码的任何详细信息-几乎不可能知道它来自何处@Liath这就是问题所在,我不确定它来自哪里。所有内容都在try-catch中并检查为null仍然会弹出此错误,我阅读了上面的文章,指出如果listview在tabcontrol中,这是一个错误,可能就是这样。启用“异常中断”并仅禁用我的代码?@Liath不确定你的意思,可能是我不熟悉,也可能是我没有正确理解你。我再次检查了代码,在插入listview之前检查了all是否为null,并将其放入try catch now。一件事是它确实显示了上面的错误,但没有崩溃。我可以继续前进,但如何完全避免它。这是一个简单的listview,但是数据是使用多个线程存储在其中的。但是同一段代码运行了6个多月,却突然出现了随机错误。@confusedMind:您是否使用
    InvokeRequired/BeginInvoke/Invoke
    从这些线程对ListView进行操作