2013-12-23 31 views
-2

我遇到了这个问题,其中有一个非常大的窗体(winforms)通过Activation.CreateInstance(Type)方法加载,因为加载容器用于不同的表单。它第一次打开罚款,但如果我关闭它然后重新打开它,它将总是在通过InitializeComponent()方法中途崩溃,在那里它跳转到Dispose()方法,崩溃在NullReferenceException第二次打开时出现大表格崩溃

我目前的理论是,Dispose()电话是从没有完成的时间,目前正设法处置当前表单形式的一个实例。 (这是否有意义?)另一方面,我认为这可能是导致问题的Activation.CreateInstance(),但这是我第一次看到这个类,所以我不太确定。

我今天早些时候在调试的时候做了一个测试,如果我在崩溃的InitializeComponent()的每一行上等了几秒钟,我就没有犯错。

+0

为什么不只是'隐藏'而不是'close'?如果你的“处置”理论是正确的,那应该没问题。 – KSdev

+0

我试过'隐藏'而不是'close',但它仍然崩溃。有什么方法可以知道一个对象是否正在处理,并阻止UI重新打开表单直至完成? –

+1

你能提供样本代码吗? – Grundy

回答

0

最后,我发现了错误的根源:加载表单有几百个网格,上面有几个工具栏,每个工具栏上都有5-6个图标。而且,资源管理器有点愚蠢,而不是每次重复使用相同的图标(工具栏是同一个用户控件的实例),它每次都会实例化一个新的位图,而且内存不足。但是,它并没有因为明显的错误而失败,而是将它松动并开始处理调用对象,因此处置不完全创建的对象。所以这里的解决方案是确保在使用资源管理器时只加载一次图像。它不仅可以解决崩溃问题,而且加载速度也更快。

相关问题