尝试显示MDI子窗体时AccessViolationException

时间:2014-06-03 07:24:32

标签: c# multithreading winforms mdi

我正在开发64位MDI Winforms应用程序。当应用程序启动时,它会继续加载大量数据 - 当满载时,进程内存大约为9 GB。

加载后,用户可以选择多种表单中的一种,这些表单显示为MDI子项。

  SomeForm f = new SomeForm(); // Oops. v1 of this question had null here! Edited to correct this.
  f.MdiParent = this; // Boom! AccessViolationException
  f.Show();

这就是我实例化和显示子表单的方式。这正是我做了几十次的事情,除了现在我在执行第二行时遇到AccessViolationException。任何人都知道为什么这会给我一个问题?一些想法:

  1. 64位Winforms。 64位Windows下的MDI功能可能还没有被正确测试。 MDI有点过时了。

  2. DEP(数据执行保护)的一些问题 - 进程大小是否存在某种内部限制,DEP超出此限制?

  3. 某种线程问题。上述8 GB以上的数据是通过新的Thread()对象加载的。这会频繁回调主机表单以更新进度,主机表单会正确显示。 (UI代码包含在Invoke语句中)。数据加载过程完成后,线程终止;

  4. 不太可能的场景,但我抓着稻草。

2 个答案:

答案 0 :(得分:1)

您必须创建SomeForm

的实例
  SomeForm f = new SomeForm(); // <- instead of " = null"
  f.MdiParent = this; // <- that's quite OK to assign value to the isntacne
  f.Show();

答案 1 :(得分:0)

你确定new SomeForm()在构造函数中没有失败吗?

在这种情况下,您尝试在此行中设置Disposed对象的属性:

f.MdiParent = this;