CLR via C# 讀書筆記 2-2 編譯器優(yōu)化導(dǎo)致的問題 - Timer
DotNet項目在Debug 和Release 模式一個主要的差別就是有沒有打開編譯器優(yōu)化
在Release下由于采用了編輯器優(yōu)化,那么原來有些運行正常的代碼就會出問題
下列代碼, 系統(tǒng)覺得Timer已經(jīng)沒有用了...所以就被回收了..
所以在Release模式下 timer只會執(zhí)行一次
(注意如果是Debug模式那么一直運行)
(注意如果使用Visual Studio的調(diào)試器, vs會幫你延長臨時變量的生命周期...那么也會一直運行)
(調(diào)用GC.Collect()是為了顯式執(zhí)行GC 以體現(xiàn)t被回收的情況, 真實情況中 非常不推薦顯式的調(diào)用GC.Collect() )
代碼
using System;
using System.Threading;
public static class Program
{
public static void Main()
{
// Create a Timer object that knows to call our TimerCallback
// method once every 2000 milliseconds.
Timer t = new Timer(TimerCallback, null, 0, 2000);
// Wait for the user to hit <Enter>
Console.ReadLine();
}
private static void TimerCallback(Object o)
{
// Display the date/time when this method got called.
Console.WriteLine("In TimerCallback: " + DateTime.Now);
// Force a garbage collection to occur for this demo.
GC.Collect();
}
}
修復(fù)此類問題一般是把臨時變量提升到類的成員變量
例如 private static Timer t; (不可能被gc)
還有 private Timer t ; (如果當前類的實例還在 就不會被gc)

浙公網(wǎng)安備 33010602011771號