2017-09-25 13 views
2

質問Can Timers get automatically garbage collected?のため、System.Timers.Timerが最初にガベージコレクションされないことがわかっています。System.Timers.Timerを停止する必要がありますか?

私の実際の質問です - 私はタイマーを停止または処分する必要がありますか?

private void CreateTimer() 
{ 
    var timer = new Timer(); 
    timer.Elapsed += TimerElapsed; 
    timer.Interval = 30000; 
    timer.AutoReset = true; 
    timer.Enabled = true; 
} 

このタイマーは永遠に動作します。しかし、今では、方法でタイマーを作成したオブジェクトはもう必要ありません。ガベージコレクションされたTimerを停止または処分する必要がありますか?

+0

停止と廃棄の間に違いがあります。タイマーを停止することは、タイマーのライフサイクル中に誰かが必要とするでしょう – apomene

+0

あなた自身でそれを確認することができます:MesseBox.ShowのようなものをElapsedで作成し、例えばサブウィンドウを閉じることでオーナーを殺す。 – sTrenat

+1

あなたは 'dispose'を呼び出すまでガーベジコレクションされないと思います。タイマーを停止するかどうかは関係ありません。詳細は、「コンポーネントへの最後の参照をリリースする前に、常にDisposeを呼び出します。それ以外の場合、ガベージコレクタがComponentオブジェクトのFinalizeメソッドを呼び出すまで、使用しているリソースは解放されません。https://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.110).aspx – Achilles

答えて

2

.Dispose()と呼ぶまでガーベッジコレクションされません。タイマー .Stop()かどうかは関係ありません。

だから、それはあなたのためTimer.Dispose()を呼び出しますのでTimer.Stop()を呼び出すか、falseにTimer.Enabledを設定することは、十分であることを表示されます。 参考:Timer.Enabled

MSDNから:あなたがコンポーネントへの最後の参照を解放する前に

、必ずDisposeを呼び出してください。そうしないと、ガベージコレクタがComponentオブジェクトのFinalizeメソッドを呼び出すまで、使用しているリソースは解放されません。 More here

あなたはそれが自動的にオフに配置することがしたい場合はHereが説明したように、その後、Timer.Elapsedプロパティを使用して別の方法でそのロジックを置きます。

+1

いいえ - "その上で' .Dispose() 'を呼び出すまでガベージコレクションされるとは思いません。" - それは正しくありません。ライブ参照がない場合、 '.Dispose()'が呼び出されたかどうかにかかわらず、GC'edされます。 – Enigmativity

+1

タイマーを停止するだけで十分ですが、明示的なDispose()は必要ありません。IDisposableが何を意味するのではなく、決して必要なことではありません。 Winformsはそれを悪用しますが、BCLクラスには適用されません。 –

+0

Timerクラスの実装を見ると正しいです。 'Timer.Stop()'は実際には 'Enabled'をfalseに設定します。これは' timer.Dispose() 'を呼び出すので、' Timer.Stop() 'を呼び出すだけで十分です。私は答えを更新します。 – Achilles

関連する問題