.net base.dispose()也正在关闭其他窗体。

.net base.dispose()也正在关闭其他窗体。,.net,winforms,dispose,.net,Winforms,Dispose,我在我的应用程序中使用了两种形式,比如A和B。在关闭A时,我需要调用A else的dispose方法中的base.dispose(),因为有时由于内存问题,我会看到应用程序出现一些意外行为。 表单B是通过表单B=新表单本地声明的表单,并通过ShowDialog方法显示。 当我调用表单A中的base.dispose()时,它也会关闭表单B。但是我需要把B表开着。有什么建议吗 谢谢, Abhinav由于表格A拥有表格B,这是预期的行为 将表单B的声明和创建作为Program.cs中的全局资源移动到您

我在我的应用程序中使用了两种形式,比如A和B。在关闭A时,我需要调用A else的dispose方法中的base.dispose(),因为有时由于内存问题,我会看到应用程序出现一些意外行为。 表单B是通过表单B=新表单本地声明的表单,并通过ShowDialog方法显示。 当我调用表单A中的base.dispose()时,它也会关闭表单B。但是我需要把B表开着。有什么建议吗

谢谢,
Abhinav

由于表格A拥有表格B,这是预期的行为

将表单B的声明和创建作为
Program.cs
中的全局资源移动到您的应用程序中,并从表单a调用其
Show()
方法

ShowDialog
表示模式对话框,在您描述的场景中没有意义。如果确实需要,请指定一个全局所有者,并在
ShowDialog(所有者)


顺便说一句,关注内存问题的根本原因,而不是试图围绕它实现基于UI的看门狗功能。

在应用程序设置中,您可以定义关闭模式(在mainform上关闭或在last form上关闭)。尝试将其设置为在最后一个窗体关闭

更新:我只是自己尝试了一下,然后关闭了调用者(在另一个窗体上调用ShowDialog()的窗体也会关闭对话框本身,我想这是出于设计

但是,使用此代码,我可以创建一个对话框,关闭调用者,对话框仍然存在:

// inside formA
private void button2_Click(object sender, EventArgs e)
{
    var owner = new Form();
    var dialog = new FormB();

    // attach to the dialog.button1.Click event to force a close
    // of the current formA instance.
    // button1.modifiers has (at least) to be set internal
    dialog.button1.Click += (x, y) => this.Close();
    dialog.ShowDialog(owner);

    dialog.Dispose();
    owner.Dispose();
}
现在,如果我点击表格B中的按钮1,表格A关闭,表格B仍然存在。
FormA不是主窗体。

两者都是在Program.cs中单独创建的。它们彼此不相关。@abhinavp您使用的ShowDialog或ShowDialog(此)是哪个版本的ShowDialog方法?我有一个基本桌面应用程序,一天都没有关闭。我们有一个预定义的机制在该应用程序中植入插件/外接程序。假设我创建了两个外接程序,一个外接程序继承windows窗体并可以显示一个弹出窗口。Sencond addin声明窗体B=new form()并执行B.showDialog()。那么我应该在哪里定义关闭模式。我不能在基本应用程序中进行更改。我以为您的主窗体(首先启动的窗体)是窗体A。现在默认情况下,如果您打开窗体B(不带ShowDialog())关闭表单A,表单B也会关闭,除非您更改它。但是,如果不是这样,我建议您重写表单B中的Dispose方法并设置断点或引发异常。也许您可以从StackTrace跟踪调用方。现在的问题是,表单B在第二个加载项中声明为全局变量(表单B=新表单())由于我们必须根据添加到表单B中的控件中发生的某些事件对此表单执行某些操作。我如何重写该表单的Dispose方法?由于它是一个全局变量,并且在多个函数中使用,因此我不能同时使用“using”。在这种情况下,您可以如何重写Dispose吗?我在当前的回答中添加了一个可能的解决方案。