簡體   English   中英

如何處理對象處置異常是C#中未處理的異常?

[英]How to handle object disposed exception was unhandled Exception in c#?

我在C#Windows應用程序中工作。我有兩個窗口,分別是Form1和Form2。我正在通過單擊Form1中的按鈕來調用Form2,但是我在Form1的構造函數中為Form2創建了對象。如果我第一次單擊按鈕,則Form2出現了成功之后,我通過單擊默認的關閉按鈕關閉了form2,然后再次單擊該按鈕,現在我得到對象處置異常是未處理的異常。如何避免這種情況?

不要處理異常,請修復代碼中的錯誤。 關閉表單后,表單實例已失效,無法再次顯示。 可以這樣寫:

    private void button1_Click(object sender, EventArgs e) {
        var frm = new Form2();
        frm.Show(this);
    }

或者,如果您只希望表單的一個實例可見:

    Form2 theForm;

    private void button1_Click(object sender, EventArgs e) {
        if (theForm != null) {
            theForm.WindowState = FormWindowState.Normal;
            theForm.BringToFront();
        }
        else {
            theForm = new Form2();
            theForm.FormClosed += delegate { theForm = null; };
            theForm.Show(this);
        }
    }

您正在保留對該對象的引用(此處的窗口),但您正在關閉它。 對象已處置但未進行垃圾收集。 由於對象已失去其可用狀態,因此此處的引用現在無效。

如果您需要重新使用它,則需要隱藏它而不是關閉它。 或創建一個新實例以再次加載它。

您可以使用事件,以便在關閉form2時通知form1並清除對其的引用。 然后,如果form1已關閉,則不需要調用form2。

我們在這里使用插入第三方應用程序的一些工具來執行類似的操作。 下面的代碼示例:

public class Form1 : Form
{
    private Form2 otherForm;

    private void ActivateForm2_Click(object sender, EventArgs e)
    {
        if (otherForm == null || otherForm.IsDisposed)
        {
            otherForm = new Form2();
            otherForm.FormClosed += new FormClosedEventHandler(otherForm_closed);
        }
        otherForm.Show(this);
    }

    private void otherForm_Closed(object sender, FormClosedEventArgs e)
    {
        otherForm.Dispose();
        otherForm = null;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM