DotNet項目在Debug 和Release 模式一個主要的差別就是有沒有開啟編譯器最佳化
在Release下由於採用了編輯器最佳化,那麼原來有些運行正常的代碼就會出問題
下列代碼, 系統覺得Timer已經沒有用了...所以就被回收了..
所以在Release模式下 timer只會執行一次
(注意如果是Debug模式那麼一直運行)
(注意如果使用Visual Studio的調試器, vs會幫你延長臨時變數的生命週期...那麼也會一直運行)
(調用GC.Collect()是為了顯式執行GC 以體現t被回收的情況, 真實情況中 非常不推薦顯式的調用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();
}
}
修複此類問題一般是把臨時變數提升到類的成員變數
例如 private static Timer t; (不可能被gc)
還有 private Timer t ; (如果當前類的執行個體還在 就不會被gc)