2012-03-16 16 views
4

私はsplitviewcontainerを持つ単純なフォームを持っています。左側はメニューで、右側は1つ以上のコントロールを含んでいます。私のコントロールのタイマーは、クリアされた後どのように停止する必要がありますか?

RHSにロードできるコントロールの1つに、数秒ごとにデータを更新するタイマーが含まれています。

右側にControls.Clear()を使用すると、コントロールは表示されなくなりますが、タイマーがまだ起動しているため、コントロールが破棄されていないと見なします(データベース呼び出しはログ)。

私のコントロールは、表示から削除されたときにコントロールをどのようにクリーンアップする必要がありますか?コントロールがクリアされたときに呼び出されるイベント/メソッドはどれですか?

+0

可視プロパティをオーバーライドして、その上でタイマーを開始および停止できますか? –

+0

または親の変更を待ち受けますか? –

+0

タイマーが催眠/ティックイベントを発動するのを止める方法や、コントロールをパネルに配置する方法について質問していますか? – Steve

答えて

1

コントロールで適切なDispose()メソッドを呼び出す必要があります。

拡張メソッドを使用すると、this答えを参照してください。

RHSにロードできるコントロールの1つに、数秒ごとにデータを更新するタイマーが含まれています。

ここで競合状態が発生している可能性があります。まだ作成されていないClear()拡張メソッドを呼び出すと、コールバックが必要になる可能性があります。タイマーコールバック関数がアプリケーションでデータ破損を招く可能性がある場合は、このような処理を行う必要があります。

Timer.Stop(); 
Timer.Tick -= Timer_Tick(TimerCallback); 
Timer.Dispose(); 

ここでもう1つの質問です。これらのコントロールを非表示にすることは可能ですか?あなたがそれをやり遂げるのを妨げている制約はありますか?

+0

コントロールにメモリリークの問題が隠れているだけではありませんか? – KingCronus

+0

@AdamKing:あなたはその結論に導きますか? –

+0

私の理解は、Hideはコントロールがメモリであることを保持し、それを表示しないということでした。これは当てはまりませんか? – KingCronus

1

コードのこの作品なければならない仕事

public Form1() 
{ 
    InitializeComponent(); 
    UserControl cc = new UserControl(); 
    Panel pp = new Panel(); 
    pp.Controls.Add(cc); 
    pp.ControlRemoved += new ControlEventHandler(pp_ControlRemoved); 
    pp.Controls.Clear(); 
} 

void pp_ControlRemoved(object sender, ControlEventArgs e) 
{ 
    var control = sender as MyVerySpecialControl; 
    if (control != null) 
    { 
     //stop timers or unassign events 
    } 
} 

私は)私は(というよりも、クリア拡張メソッドを使用するすべての疑問

0

に答えて喜んでいると思います。また、子コントロールをループして具体的に処理します。 IDisposeを持たない証明コントロールがある場合は、ループの中でそれらを特定し、それらを停止させて最終的にクリアすることができます。

関連する問題