2

RichTextBoxRichText のリソース ファイルが読み込まれた を含む子フォームがあります。

子フォームを閉じるボタンをクリックすると ( を使用Close())、フォームが閉じて親フォームに戻ります。ただし、リソースは破棄されていません。実際、マウスのボタンをほぼ使い果たした後、記憶は本当にエスカレートしました。

リソースが最終的に解放されるかどうかを確認するためのテストとして、親にフォーム タイマーを設定して子フォームをロードし、別のフォーム タイマーを子フォームに呼び出してClose(). 今回は、約 5 ~ 6 回の開閉サイクル後にリソースが解放されました。

うーん.. と思いました。そこで、現実をシミュレートするためにセットアップを変更しました。今回は、子フォームのタイマー起動イベントを、文を含むpressedイベントを起動するcontainbutton1.PerformClick()に変更しました。今回はリソースが解放されず、テストを中止する前にメモリ使用量が 1 ギガバイトに達しました。button1Close()

を含むボタン イベントが、を含むClose()タイマー イベントと異なるのはなぜClose()ですか?

OK..子フォームを開くための親フォームのコードは次のとおりです。

private void showSplashScreen()
{
    // Instantiating SplashScreen
    SplashScreen splash = new SplashScreen();
    // Displaying SplashScreen
    splash.ShowDialog();
}

フォームを閉じるための子フォームのコードは次のとおりです。

private void button1_Click( object sender, EventArgs e )
{
    Close();
}


private void timer1_Tick( object sender, EventArgs e )
{
    button1.PerformClick();
//    Close();
}

この方法で実行すると、メモリ使用量がエスカレートします..しかし、button1.PerformClick()コメントアウトされ、Close()コメント解除されている場合、リソースは定期的に解放されます

4

2 に答える 2

1

Form.Close MSDN ドキュメントによると、 ShowDialogを使用する場合は、リソースを手動で破棄する必要があります。FormClosingイベントで行うことです。タイマーを使用すると機能する理由については、よくわかりません。しかし、通常、a を使用ShowDialogして DialogResult をチェックしているときは、親からフォームを閉じます。あなたがしたように使用Usingすると、よりきれいに処理されますが。

SplashScreen splash = new SplashScreen(); 
DialogResult dr == splash.ShowDialog(); 

if (dr == System.Windows.Forms.DialogResult.OK)
{
    //Do something
}
else
{
    //do something else
}

splash.Close();
splash.Dispose();

Close でフォームが破棄されない 2 つの条件は、(1) マルチ ドキュメント インターフェイス (MDI) アプリケーションの一部であり、フォームが表示されない場合です。(2) ShowDialog を使用してフォームを表示しました。このような場合、Dispose を手動で呼び出して、フォームのすべてのコントロールにガベージ コレクションのマークを付ける必要があります。

于 2012-10-04T15:33:17.353 に答える
0

OK みんな、Cyborgx37 のアイデアで、親フォームの呼び出し方法を次のように変更しました:-

private void showSplashScreen()
{
    // Instantiating SplashScreen.  'using' to allow proper release of resources
    using ( SplashScreen splash = new SplashScreen() ) {
        // Displaying SplashScreen
        splash.ShowDialog();
    }
}

これにより、リソースが正しく解放されるようになりました。ただし、子フォームを閉じるタイマーがリソースの適切な破棄を許可し、ボタンのクリックで閉じることができない理由がわかりません。IL コードも調べましたが、2 つのメソッドは同じコードを使用しています。何か案は?

于 2012-10-04T15:10:41.647 に答える