CLR via C# 讀書筆記 2-2 編譯器最佳化導致的問題 – Timer

來源:互聯網
上載者:User

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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.