2011-02-04 1 views
2

子供とそれ自身を処分するのと同等のパネルを処分していますか?以下のクラス内

class MyPanel : Panel 
{ 
    ... 
    protected override void Dispose(bool disposing) 
    { 
     // My code here 
    } 
} 

次の2個のコードサンプルが同等ですか?

if (disposing) 
{ 
    List<Control> ctrls = new List<Control>(this.Controls); 
    this.Controls.Clear(); 
    foreach(Control c in ctrls) 
    { 
     c.Dispose(); 
    } 
} 
base.Dispose(disposing); 

base.Dispose(disposing); 

それらが異なる効果を持っている場合、それは何でしょうか?

編集:それはその子(disposingがtrueで、Controlsは2つのコントロールを含む)のいずれかを配置に到達する前にので、私はそれを最初の方法をやって、どんな理由であれ、これを聞いては、第二の方法のに対し、私のプログラムをフリーズ正常に動作します。私が喜んで2番目のものを使うことができれば、それは素晴らしいことです。

+0

論理的には同じですが、通常は同じ結果になります。 Clear()コールはコントロールウィンドウをパーキングウィンドウに移動します。この(スレッディング)バグは、あなたの後端を別の方法でバイトすることになります。 –

+0

@ジョー:私たちは同じことを話していると確信しています。子パネルがまだ実行中でイベントを生成している場合は、イベントハンドラがリークしていることは明らかです。つまり、2番目の方法が優れているわけではありません。つまり、オブジェクトを適切に管理する必要があるということです。 –

+0

@Cody、あなたは正しいです。私はちょうど私が行っていたことは、プレゼンター(ビューごと)を繰り返して、それらを処分して、イベントハンドラを処分するというコードを見ている間に気づいた。私はすべてのボタンとテキストボックスをビューに表示しません。それは愚かなので、最初のコメントを取り消します。 btw、私はあなたの答えにコメントしたのと同じジョーではありません、それは詐欺師です! – Joe

答えて

3

はい、コンテナを破棄すると、自動的に子コントロールが破棄されます。

MSDN documentationによると、Control.Dispose方法:

はコントロールによって使用されているアンマネージリソースを解放し、その子はを制御し、オプションでマネージリソースを解放します。

だから、自動的にその子コントロールを配置します Panelコントロールの Disposeメソッドを呼び出します。しかし、Joeのコメントで指摘されているように、これに対して重要な注意点があります。子コントロールは、親のスコープ外で宣言されたイベントからの登録を解除する必要があります。イベントが生き続けるオブジェクトのメンバーである場合、イベントは子コントロールも生き残り状態に保ち、適切に処理されないようにします。明らかに、親のように同時に処分されているオブジェクトで宣言されたイベントから退会する必要はありません。

もちろん、これはコントロールのコンテナ(おそらくFormコントロール)にも拡張することはできません。 を所有するDisposeFormの場合は、Panelコントロールとそのすべての子供が自動的に処理されます。動的にフォームを追加したりフォームからインスタンスを削除したりしない限り、Panelコントロールに対して明示的に行う理由はありません。

+0

それは面白いです。 「パネルを所有している」という意味は、コントロールを作成してフォームに追加することです。この方法では、フォームを破棄した場合、追加されたコントロールのタイマーは起動し続けます。私はここでのキーを推測しています。所有権です。フォームのdesigner.csファイル内から宣言されていない子を所有する方法 – Joe

+0

@ジョー:「タイマー」と言いましたが、あなたはものにレンチを投げました。どのようにタイマーをコントロールに追加しましたか?タイマーは、コントロール自身が所有している必要はないので、コントロール自体が存在するときにタイマーが処分されるという保証はありません。 –

+0

hum ...私のタイマーは、フォームに追加されたコントロール内のコンストラクターから作成されます。だからそこにスコープの問題があってはならない... – Joe

2

(それはまだ無料ですながら行うのは簡単!)あなたは簡単にリフレクターを使用してControl.Disposeの実装を見て、見ることができるよう

をたとえば、あなたは自分のパネル上のDisposeを呼び出す場合2は、同一ではありません、子コントロールでDisposeAxControlsを呼び出し、その子からDisposeを呼び出す前に、親コントロールを削除します。

しかし、私はCody Grayに同意します。あなたが提案した回避策を使って "カーペットの下の問題を掃除"しようとするのではなく、なぜ凍結しているのかを理解する必要があります。

通常、Panel上でDisposeを明示的に呼び出さないでください。そうしている場合は、コントロールの有効期間と所有権を正しく管理していることを確認する必要があります。

あなたのアプリを凍結しなくなるまで段階的に開始すること - 凍結の原因となっていることを解決すること(例えば、あなたが1つ1つ言及したタイマーを削除する - 疑わしいと思われる)。問題を示す非常に単純な例があれば、あなた(または他の人)が何が起こっているのかを簡単に理解することができます。

関連する問題