c#(winforms)异常中两个窗体之间的交互

c#(winforms)异常中两个窗体之间的交互,c#,winforms,exception,C#,Winforms,Exception,我正在开发一个WinForm应用程序。 我有两个窗体,窗体1是主窗口,窗体2用于设置。 我使用这种方法在两种形式之间进行交互: 格式1中的代码: private void startForm2_Click(object sender, EventArgs e) { Form2 frm = new Form2(this); frm.Show(); } public void changeFontSize() //promenq razmera n

我正在开发一个WinForm应用程序。 我有两个窗体,窗体1是主窗口,窗体2用于设置。 我使用这种方法在两种形式之间进行交互:

格式1中的代码:

   private void startForm2_Click(object sender, EventArgs e)
   {
       Form2 frm = new Form2(this);
       frm.Show();
   }
   public void changeFontSize() //promenq razmera na shrifta
   {
       ...
   }
格式2中的代码:

Form1 F1 = new Form1();

public Form2(Form1 aF1)
{
    InitializeComponent();
    F1 = aF1;
}
private void button1_Click(object sender, EventArgs e)
{
    F1.changeFontSize();
}
当我关闭form2时,它会抛出一个异常:

无法访问已释放的对象。对象名称:“图标”

一致

protected override void Dispose(bool disposing)
{
    ChangeClipboardChain(this.Handle, nextClipboardViewer); // Clean up any resources being used.
    ...

在Form1.Designer.cs文件中

您应该处理Form2关闭事件上的所有资源。

表单F1=new Form1()字段应仅为
表单F1。现在,您正在创建一个新的
Form1
实例,该实例根本不使用(覆盖构造函数中的字段),GC将不确定地处理和收集该实例

最有可能的是,这个“隐藏”实例是在处理过程中产生问题的实例


您还可以尝试将该方法移动到
表单.FormClosed
事件处理程序中,尽管它似乎更适合
Dispose
方法。

事实并非如此。如果有一个
Dispose
方法,作为
IDisposable
接口的一部分,负责处理对象,则不太可能在其他地方处理对象。但在本例中,我不确定P/Invoke代码是否确实释放了一些本机资源(根据MSDN描述,它可能释放了)。