2014-12-03 18 views
0

我使用下面的代碼隱藏窗體並顯示一個新的(基本上,我想要在兩個窗體之間切換)。但每次按下按鈕2或按鈕1時,我的應用程序在任務管理器中的內存使用量都會增加。每次單擊我的按鈕時,此內存使用量都會增加,並且直到Application.Exit()纔會釋放它。這是一些內存泄漏?我是否錯誤地管理我的表單?這是內存泄漏嗎? Winforms隱藏和顯示錶單

非常感謝。

FORM 1:

Form2 pform2; 
private void button2_Click(object sender, EventArgs e) 
{ 

    if (form2 != null) 
    { 
     pform2.Show(); 
    } 
    else 
    { 
     pform2 = new Form2(); 
     pform2.Show(); 
     this.Hide(); 
    } 
    this.Hide(); 

FORM 2

Form1 pform1; 
private void button1_Click(object sender, EventArgs e) 
{ 

    if (form1 != null) 
    { 
     pform1.Show(); 
    } 
    else 
    { 
     pform1 = new Form1(); 
     pform1.Show(); 
     this.Hide(); 
    } 
    this.Hide(); 
+0

使用任務管理器查找內存泄漏的人員不得再使用計算機。 – Dennis 2014-12-03 10:53:40

+0

@丹尼斯對於內存消耗的簡單看來,它已經足夠了...... – derape 2014-12-03 10:58:20

+0

@丹尼斯真的很有用的評論,謝謝。 – Arturo 2014-12-03 11:00:38

回答

2

如果您使用調試器,你會清楚地看到發生了什麼事。 問題是,每次單擊按鈕時,都會創建Form1Form2的新實例。字段pform1例如。 pform2然後每次都爲空,因此單擊按鈕時會創建一個新實例。

我認爲你正在尋找的東西是這樣的:

public class Main 
{ 
    public Main() 
    { 
    var form = new Form1(); 
    form.ShowDialog(); 
    } 
} 

public class Form1 : Form 
{ 
    private readonly Form2 _form2; 

    public Form1() 
    : this(null) 
    { 
    _form2 = new Form2(this); 
    } 

    public Form1(Form2 form2) 
    { 
    _form2 = form2; 
    var button = new Button(); 
    button.Click += ButtonOnClick; 
    Controls.Add(button); 
    } 

    private void ButtonOnClick(object sender, EventArgs eventArgs) 
    { 
    this.Hide(); 
    _form2.Show(); 
    } 
} 

public class Form2 : Form 
{ 
    private readonly Form1 _form1; 

    public Form2(Form1 form2) 
    { 
    _form1 = form2; 
    var button = new Button(); 
    button.Click += ButtonOnClick; 
    Controls.Add(button); 
    } 

    private void ButtonOnClick(object sender, EventArgs eventArgs) 
    { 
    this.Hide(); 
    _form1.Show(); 
    } 
} 
+0

謝謝,我只是想確定,如果我的程序是內存泄漏或不,你的答案證明是有用的:) – Arturo 2014-12-03 11:01:29

+0

如果我問一些問題? Visual Studio告訴我,IFs條件中的form2和form1在當前上下文中不存在。 – Arturo 2014-12-03 11:56:12

+0

@Auro我已經把我的例子修改爲一個完整的例子,你可以像這樣運行它 – derape 2014-12-03 12:21:00

1

基於代碼的您提供:你是不是形式之間的「切換」,我們製作了新的形式,每次

假設您在Form1並按下按鈕。然後pform2將被創建並顯示,但因爲你沒有通過你的Form1實例pform2 - 這將有空在pform1,所以當你將在形式按按鈕,Form1實例將被創建和顯示等on .....

+0

非常感謝!如果我可以將兩個帖子標記爲答案,我也會標記你的帖子。真的有用:) – Arturo 2014-12-03 11:02:05

+0

@Arturo,從來沒有。但你可以放棄,不僅標記爲接受。 ;) – 2014-12-03 11:03:28

+0

@Andy_Korneyev看來我需要15點的聲望(我還沒有)對不起:( – Arturo 2014-12-03 11:10:58