次のコードは、デバッグ ビルドとリリース ビルドの違いを示すよく知られた例です。
using System;
using System.Threading;
public static class Program
{
public static void Main()
{
Timer t = new Timer(TimerCallback, null, 0, 2000);
Console.ReadLine();
}
private static void TimerCallback(Object o)
{
Console.WriteLine("In TimerCallback: " + DateTime.Now);
GC.Collect();
}
}
これをデバッグ構成で実行すると、タイマーは現在の時刻を 2 秒ごとに出力します。コンパイラは人為的に変数の寿命を延ばすため、これは何のGC.Collect
効果もありません。Timer t
リリース構成では、タイマーは 1 回だけ実行されます。は変数GC.Collect
をガベージ コレクションし、それだけです。t
これはすべて正常に機能します。奇妙なことに、行 Console.ReadLine を Console.ReadKey に変更すると、両方の構成で 2 秒ごとにタイマーが実行されます。
Console.ReadKey と Console.ReadLine の違いは何ですか? Console.ReadKey が ReadKey メソッドを発行するスレッドをブロックすることをドキュメントから理解しました。しかし、GC.Collect は引き続き起動します。
Timer t
メインスレッドをブロックすることで の寿命が延びるのはなぜですか?
アップデート
.NET 3.5 を使用している場合、この動作は発生しません。