gpt4 book ai didi

c# - ObjectDisposedException when .Show( )'ing a form that shouldn' t 被处理

转载 作者:行者123 更新时间:2023-11-30 15:11:10 25 4
gpt4 key购买 nike

我检查了一些其他问题,显然最好的解决方案是首先防止导致此问题的行为,但问题非常间歇性,而且非常不可重现。

我基本上有一个主窗体和子窗体。子表单显示在主表单的菜单和/或按钮中,如下所示:


private void myToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
xDataForm.Show();
xDataForm.Activate();
}
catch (ObjectDisposedException)
{
MessageBox.Show("ERROR 10103");
ErrorLogging newLogger = new ErrorLogging("10103");
Thread errorThread = new Thread(ErrorLogging.writeErrorToLog);
errorThread.Start();
}
}

子表单实际上在主表单中(无论好坏。我实际上想更改它,但这样做会花费大量时间):


public partial class FormMainScreen : Form
{
Form xDataForm = new xData();
...(lots more here)

public FormMainScreen(int pCount, string pName)
{
InitializeComponent();
...
}
...
}

修改了子表单的 Dispose 函数,“关闭”和“X”按钮实际上隐藏了表单,因此我们不必每次都重新创建它。当主屏幕关闭时,它会将一个“标志”设置为 2,这样其他窗体就知道实际上可以关闭了;


protected override void Dispose(bool disposing)
{
if (FormMainScreen.isExiting == 2)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
else
{
if (xData.ActiveForm != null)
{
xData.ActiveForm.Hide();
}
}
}

所以,问题是,为什么这会一次又一次地完美无缺地工作,但实际上,大约每 1/1000 的时间都会导致异常,或者更确切地说,为什么我的表单会被处理掉?

我怀疑垃圾收集器被弄糊涂了,因为它在运行数小时后稍微更频繁地发生。

最佳答案

无意冒犯,但这似乎是对很久以前解决的问题的一个非常复杂的解决方案。

你不应该在 Dispose() 方法中做任何事情,除了处置其他一次性元素(即使处置标志为真)。所以我不会修改设计者为你生成的方法。

因此,关于为什么会发生这种情况的问题的直接答案几乎肯定与垃圾收集器调用您的 Dispose 方法的时间有关。

相反,您可能应该考虑使用 MDI ( multiple document interface) 父窗体,而您的“子窗体”称为 MDI 子窗体。然后,您可以像这样处理子项中的 FormClosing 事件。

(请注意,如果您反对 MDI,您可以使用表单 Owners 来做基本相同的事情。)

// MDI child
private void Form_FormClosing(object sender, FormClosingEventArgs e) {
if (e.CloseReason == CloseReason.UserClosing) {
e.Cancel = true;
Hide();
}
}

当窗体因为代码关闭、父窗体关闭、Windows 关闭等各种原因关闭时,关闭不会被取消。只有当窗口因用户直接关闭子窗体而关闭时,您才会隐藏它。

要在 MDI 父级内部显示 MDI 子级,您可以执行以下操作:

MyParentForm parentForm = new MyParentForm();
parentForm.IsMdiContainer = true;
parentForm.Show();

MyChildForm childForm = new MyChildForm();
childForm.MdiParent = parentForm;
childForm.Show();

关于c# - ObjectDisposedException when .Show( )'ing a form that shouldn' t 被处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com