質問

2011-07-08 14 views
2

重複の可能性:質問

public void SomeMethod() 
{ 
    Timer timer = new Timer(); 
    timer.Tick += new EventHandler(timer_Tick); 
    timer.Start(); 
} 

timer_Tick繰り返し呼び出され続けるであろう:
Timer, event and garbage collection : am I missing something ?

私は、次のコードを持っていたい場合SomeMethodが終了した後も、どこにでもタイマーへ?

私はおそらく、TimerのDisposeメソッドが呼び出されるまで考えています。しかし、一般的に、GCはオブジェクトがいつ廃棄されたのかを知っていますか?

+0

'System.Windows.Forms.Timer'または' System.Web.UI'だけが 'Tick'を持っています。 –

+0

それは問題ですか? 'System.Windows.Form.Timer'です。しかし、私はサンプルとして使っています。私は一般的にどのようにこれが動作するかを知りたい。 – Juan

+0

これはTickという名前のイベントを持つ唯一のイベントだから、System.Windows.Forms.Timerだと思います。 (afaik) – luketorjussen

答えて

2

他の回答とは逆に、いいえ、タイマーはガベージコレクションされません。

内部的には、GCHandleオブジェクトを割り当てます。このオブジェクトは、オブジェクト、したがってタイマーを保持します。したがって、実装するイベントハンドラを無効にするか、プログラムが終了するまでオブジェクトを保持します。まず来る。

これはすでにSO、here: Timer, event and garbage collection : am I missing something ?で回答されていますので、この質問を重複して終了します。

0

GCは次のクロール時に収集します...他のオブジェクトと同様です。 タイマーがイベントを参照しています。インスタンスのイベントではないため、GCが実行されます。

1

timerへの参照はどこにもありません。したがって、ガベージコレクションの対象となります。

timerオブジェクトにはtimer_Tickメソッドの参照がありますが、それは問題ではありません。それはまだ収集することができます。

+0

必ずしもタイマーを止めるわけではありませんが、 'Timer'の設計方法によって例外が発生する可能性があります。これは、マネージガベージコレクションについてはまあまあです。 – Juan