2014-08-28 60 views
1

我有一個控制檯應用程序,具有下列主要程序:定時器只能在調試模式下

static void Main(string[] args) 
    { 
     var timer = new System.Threading.Timer(
     e => 
      { 
      //some code here 
     }, 
     null, 
     TimeSpan.Zero, 
     TimeSpan.FromMinutes(1)); 


     var backupTimer = new System.Threading.Timer(
     e => 
     { 
      //some code here 

     }, 
     null, 
     TimeSpan.Zero, 
     TimeSpan.FromHours(24)); 

     Console.ReadLine(); 

    } 

的問題是,在調試模式下正常工作,並調用方法在右期兩個定時器,如果輸入的東西在控制檯程序結束工作(Console.ReadLine()是爲此),但是當我在釋放模式下運行程序兩個定時器只調用一次(第一次),然後編程只是等待,直到我輸入的東西。

如何解決這個問題,所以我可以編譯一個獨立的程序正常工作?

+0

它看起來像定時器由GC抑制。 – frankie 2014-08-28 10:41:32

+0

您需要保留對計時器的引用作爲字段。否則,GC會吃掉它。 – 2014-08-28 10:43:07

+0

爲什麼它在調試模式下正常工作呢? – s1ddok 2014-08-28 10:45:24

回答

3

由於@SriramSakthivel建議你必須保持對計時器的引用作爲一個字段,否則垃圾回收器吃掉你的計時器。 所以這裏是解決方案:

private static System.Threading.Timer timer; 
    private static System.Threading.Timer backupTimer; 

    static void Main(string[] args) 
    { 

     timer = new System.Threading.Timer(
     e => 
      { 
      //something 
     }, 
     null, 
     TimeSpan.Zero, 
     TimeSpan.FromMinutes(1)); 


     backupTimer = new System.Threading.Timer(
     e => 
     { 
      //something 

     }, 
     null, 
     TimeSpan.Zero, 
     TimeSpan.FromHours(24)); 

     Console.ReadLine(); 

    } 
0

希望以下解決方案幫助!

問題:

由表示當前時鐘時間按預期下面的代碼始終工作。

class Program 
{ 
     static void TimerProcedure(object param) 
     { 
      Console.Clear(); 
      Console.WriteLine(DateTime.Now.TimeOfDay); 

      GC.Collect(); 

     } 

     static void Main(string[] args) 
     { 
      Console.Title = "Desktop Clock"; 
      Console.SetWindowSize(20, 2); 
      Timer timer = new Timer(TimerProcedure, null, 
       TimeSpan.Zero, TimeSpan.FromSeconds(1)); 
      Console.ReadLine(); 
     } 
    } 

然而,如果你運行在發佈模式相同的代碼,它顯示當前時間只在第一次,但之後它永遠不會更新。

解決方案

一個簡單的調整,加入GC.KeepAlive(對象)將使其在釋放模式也按預期工作。請參閱下面的代碼。

class Program 
    { 
     static void TimerProcedure(object param) 
     { 
      Console.Clear(); 
      Console.WriteLine(DateTime.Now.TimeOfDay); 
      #region Hidden 
      GC.Collect(); 
      #endregion 
     } 

     static void Main(string[] args) 
     { 
      Console.Title = "Desktop Clock"; 
      Console.SetWindowSize(20, 2); 
      Timer timer = new Timer(TimerProcedure, null, 
       TimeSpan.Zero, TimeSpan.FromSeconds(1)); 
      Console.ReadLine(); 
      GC.KeepAlive(timer); 
     } 
    } 

替代解決方案:正在計時器類級靜態變量

相關問題