- PR -

Timer()クラスについて

1
投稿者投稿内容
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-07 13:34
よろしくお願いします。
以下はSystem.Windows.Forms.Timer()クラスを使用して一定間隔でイベントを発生させるコードです(テストのための意味のないコードです)。
質問内容ですが、コンストラクタでTimer()クラスのインスタンスを生成しており、参照変数も同じブロック内で宣言しているためコンストラクタから抜けた場合、このインスタンスを参照するものがなくなるため、ガベージコレクタによっていずれはこのインスタンスが破棄されると思っていたのですが、正常にイベント処理が機能しています。
この場合、インスタンスは破棄されないのでしょうか?

public partial class Form1 : Form
{
private int count = 0;
public Form1()
{
InitializeComponent();

Timer timer = new Timer();
timer.Interval = 10;
timer.Tick += new EventHandler(test_tick);
timer.Start();
}
private void test_tick(object sender, EventArgs e)
{
count++;
}
}
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-06-07 14:03
どっかに書いてあったと思って MSDN ざっと調べたら、クラスの解説でもなく Start の解説でもなく Timer コンポーネントセクションにも無くて、Enabled プロパティにこそっと書いてただけでした。
Timer.Enabled プロパティ (System.Windows.Forms)

ちなみに、一見参照がなくなってるのに存在し続けるものの代表として Form クラスがあります。
// new Form().Show() はユーザが終わらせるまで普通に表示され続ける。
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-07 14:49
回答有難うございます。
なるほど、「タイマはガベージコレクションの対象ではありません」と書いてありました。
そうしますとTimerクラスは、明示的にDisposeメソッドで破棄するか、それを実装するオブジェクトが破棄されるまで参照変数の有無にかかわらず存在するということですね。まあ、Timerクラスの機能から考えれば、納得のような気がします。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-06-07 18:15
引用:

jornada690さんの書き込み (2007-06-07 14:49) より:
なるほど、「タイマはガベージコレクションの対象ではありません」と書いてありました。


「値が true の場合」ですよ。
つまりタイマーが動いている状態の時はってことです。
ちなみにSystem.Threading.Timerは動いていてもガベージコレクションの対象になります。
jornada690
常連さん
会議室デビュー日: 2006/06/13
投稿数: 25
投稿日時: 2007-06-07 22:01
引用:
--------------------------------------------------------------------------------
「値が true の場合」ですよ。
--------------------------------------------------------------------------------
ご指摘有難うございます。
ヘルプを見直したら確かにそうですね。

引用:
--------------------------------------------------------------------------------
ちなみにSystem.Threading.Timerは動いていてもガベージコレクションの対象になります。
--------------------------------------------------------------------------------
勉強になります。
1

スキルアップ/キャリアアップ(JOB@IT)