我开发了一个应用程序。它一直工作到最近,但有时它给出了以下错误,它崩溃了。错误发生时没有行号或其他信息,因此我不确定要查找的内容:
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
控件,它存储信息并显示大约所有这些超过50 k。但有时它会超过80k,有时它可能会在1k上弹出错误。这工作得很好,我从未见过这个错误超过5-6个月。这刚刚开始发生。
更新
我刚才注意到的另一个奇怪的事情就是当我在任何地方点击机器人时:此错误会在随机时间后弹出。所以不确定它有什么问题。假设我有一个Listview
,当我进入那里看到URL时,我看到如下错误,其他人工作正常,之后点击任何地方都会出现此错误。
在搜索时我也找到了Article。这完全符合Listview
中我的方案tabcontrol
,它在此处声明这是一个错误。
这是我插入ListView
的方式:
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 });
}
谢谢。
答案 0 :(得分:2)
根据您提供的信息,我可以说,您正在尝试访问可能已被处理或删除的对象,无论是有意还是无意,通常在Visual Studio内部调试时很容易查找NullReferenceExceptions。查找试图从特定情况下可能为NULL的对象读取/写入的任何代码。
答案 1 :(得分:1)
查看堆栈跟踪:
System.Windows.Forms.ListView.OnHandleCreated(EventArgs e)
这是框架代码。这是不您的代码。从栈根到崩溃的所有内容都在框架中。这几乎没有说明原因,对不起。
根据我的经验,在OnHandleCreated中遇到崩溃并不容易。我已经看过几次了,通常是因为:
我在反编译器中查看了ListView.OnHandleCreated
,我没有注意到在那里获得NullReference的任何简单方法。例如,在null
或.Items
中有.columnHeaders
或myFormConstructor()
{
InitializeComponent();
var foo = myListView.Handle;
onlyNowStartTheThreads();
}
可以,但是在那里有一个null并不容易,因为ListView在内部管理这些集合。但是,我没有看到任何锁定,所以如果发生了一个线程争用,它可能就是它。
它是一个普通的ListView,还是你将它子类化并重写一些东西?
编辑:
OnHandleCreated很奇怪..默认情况下,Handle是在控件可见时第一次创建的。如果您有任何显示/隐藏行为,并且在线程启动时,如果在窗体启动时看不到ListView,则问题可能非常微妙。
OnHandleCreated是来自控件实现的本机部分的回调。我没有在代码中看到任何锁/同步。如果ListView的实际初始化被延迟,并且线程开始抽取数据,那么我猜测 可能本机回调与您的工作线程推进竞争一个新的数据项到项目中。
尝试强制更早地创建ListView的句柄。找到你的InitializeComponent函数,然后在它之后添加一个虚拟行,并在之前添加线程的开头:
{{1}}
它将导致应用程序立即开始创建Handle并等待直到它完成。我不确定确切的比赛点,但它至少会排除那个比赛的可能性。
答案 2 :(得分:0)
要找出错误发生的位置,您可以(通常)使用“Break on exception”让调试器停在发生错误的代码行。 (使调试变得更容易,但如果你正确地处理了很多错误,那么也会很烦人。)