C# 大模板在第二次打开时崩溃

C# 大模板在第二次打开时崩溃,c#,winforms,reflection,nullreferenceexception,dispose,C#,Winforms,Reflection,Nullreferenceexception,Dispose,我有一个问题,我有一个非常大的表单(winforms),它是通过Activation.CreateInstance(Type)方法加载的,因为加载容器用于不同的表单。它第一次可以正常打开,但是如果我关闭它然后重新打开它,它总是会在InitializeComponent()方法的中途崩溃,在那里它“跳转”到Dispose()方法,在NullReferenceException上崩溃 我目前的理论是,Dispose()调用来自表单的前一个实例,该实例没有时间完成,现在正试图处理当前表单。(这有什么意

我有一个问题,我有一个非常大的表单(winforms),它是通过
Activation.CreateInstance(Type)
方法加载的,因为加载容器用于不同的表单。它第一次可以正常打开,但是如果我关闭它然后重新打开它,它总是会在
InitializeComponent()
方法的中途崩溃,在那里它“跳转”到
Dispose()
方法,在
NullReferenceException
上崩溃

我目前的理论是,
Dispose()
调用来自表单的前一个实例,该实例没有时间完成,现在正试图处理当前表单。(这有什么意义吗?)另一方面,我认为可能是
激活.CreateInstance()
导致了这个问题,但这是我第一次看到这个类,所以我也不太确定


今天早些时候,我在调试时做了一个测试,如果我在崩溃的
InitializeComponent()
中的每一行等待几秒钟,我就顺利通过了测试。

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

为什么不干脆
隐藏
而不是
关闭
?如果您的
dispose
理论是正确的,那么应该可以。我尝试了
hide
而不是
close
,但它仍然崩溃。是否有某种方法可以知道是否正在处理对象,并阻止UI在表单完成之前重新打开表单?能否提供示例代码?