私はあるイベントに基づいて、私はinitialize
という新しいフォームベースのダイアログとinitialize
というクラスを持っています。このフォームベースのダイアログには、他のコントロールがあります。C#フォームアプリケーションのメモリリーク
dialog
が閉じている場合は、フォームに作成されたすべてのコントロールをクリアして削除します。残念ながら、何かが処分されていないか、取り除かれた後でも記憶に残っているようです。
フォームformClassオブジェクト内部ポンプ
class someClass
{
System.Timers.Timer someTimer;
public void CallToChildThread(Object stateInfo)
{
// check some event
// if true, fire event
}
someClass()
{
someTimer= new System.Threading.Timer(CallToChildThread,
autoEvent, 1000, 250);
_show += new EventHandler(eventCheck);
}
void eventCheck()
{
formClass formClassObject = new formClass(); //create form
formClassObject.someFunction(); // has some other function and does a showDialog on self
formClassObject.Dispose();
formClassObject = null;
}
}
は、FormClosedイベントを取得すると、私は、オブジェクト内のコントロール内のすべてのコントロールとコントロールをオフに処分するが、顕著なメモリリークが依然として存在します。
Formクラス
public partial class formClass
{
//Initialize a bunch of managed resources to null
someOtherForm form2;
someOtherForm form3;
//connect some events on child forms to buttons on this form object
this.form2.cancelButtonClicked += someFunction;
this.form3.cancelButtonClicked += someFunction;
// Form closed Event
private void formClass_FormClosed(object sender, FormClosedEventArgs e)
{
//set form2 and form3 visibility to false
// clear AND dispose all controls of form2
// clear AND dispose all controls of form3
//set form2 and form3 to null
// clear AND dispose off all controls of formClass
// Dispose this (formClass) object
}
}
私はフォームオブジェクトを初期化した方法で可能な問題がありますか?それらは処分されないのですか?
あなたはメモリリークがあることだと思いますなぜ?ガベージコレクションは、メモリを実際に解放するときにはそれ自身で決定することに注意してください。これは必ずしも即座に起こるとは限りませんが、gcが次の割り振り要求を満たすのに十分なメモリーがないことに気づいたときに最終的に実行できます。 btw:フォームを破棄すると、すべてのコントロール自体が破棄されます。手動で行う必要はありません。 –
メモリリークがあると考えられる原因は何ですか? – tonythewest
タイマーとフォームオブジェクトを処分しようとしていますか? –