0

form1 と form2 の 2 つのフォームを含むサンプル Windows フォーム アプリケーションを作成しました。

Form1 にはボタンが含まれており、クリックすると、以下のように form2 がダイアログ ボックスとして表示されます。

private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            try
            {
                form2.ShowDialog();
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (form2 != null)
                {
                    form2.Dispose();
                    form2 = null;
                }
            }   

        }

次に、ボタンをクリックしてアプリケーションをチェックすると、form2が開き、閉じます。そしてこれを約6回続けました。

DevPartnerでアプリケーションを確認すると、常にForm2 form2 = new Form2();リークしていると表示されます

Web をチェックインすると、ShowDialog を使用している場合、フォームを閉じた後にフォームを破棄する必要がある、つまり、finally ブロックで破棄しようとした理由が示されています。しかし、それでもその行が漏れていることを示しています。どなたか、このリークについてご意見をお聞かせください。

4

3 に答える 3

0

Form2 を調査して、外部イベントおよびルート化された参照へのサブオプションを見つける必要があります。それらはすべて、フォームの破棄時に削除する必要があります。

次のコードでは、リークの原因は Idle イベントへのサブスクリプションです。サブスクリプションは、リークを避けるために Dispose メソッドで削除されます。

Form2()
{
    Application.Idle += Application_Idle;
}

void Application_Idle(object sender, EventArgs e)
{   
}   

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        Application.Idle -= Application_Idle;
    }
}
于 2013-08-08T07:30:46.540 に答える
0

原則として、IDisposableオブジェクトを使用する場合は、それをusing ステートメントで宣言してインスタンス化する必要があります。using ステートメントは、オブジェクトの Dispose メソッドを正しい方法で呼び出します。また、Dispose が呼び出されるとすぐに、オブジェクト自体がスコープ外になります。using ブロック内では、オブジェクトは読み取り専用であり、変更したり再割り当てしたりすることはできません。

using ステートメントを使用すると、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、 Disposeが確実に呼び出されます。

于 2013-08-08T07:35:49.630 に答える