2016-05-16 46 views
0
System.Timers.Timer timer= new System.Timers.Timer(1); 
      timer.AutoReset = true; 
      timer.Elapsed += (s, e) => 
      { 
       Console.WriteLine("fired"); 
      }; 
timer.Start(); 

事件在調試模式下始終觸發,並且始終未在發佈模式下觸發。我試過禁用編譯器優化,但它沒有幫助。Systems.Timers.Timer在調試中工作但不是版本

我想在一個asp.net MVC應用程序.NET 4.6框架

+1

難道'Console.WriteLine'未在發行模式下工作?我問,因爲我在控制檯有問題。WriteLine在一個配置中記錄到VS輸出窗口,但不在另一個配置中(從未想到爲什麼)。在你指責計時器之前,可能值得檢查。 – adv12

+0

您確定代碼塊甚至運行以在釋放模式下啓動計時器嗎?此外,你標記你的問題asp.net,也許你的應用程序域正在關閉? –

+0

我如何確定我的計時器正在運行?我知道它是用正確的時間間隔創建的。此外,我不確定這是否與asp相關,但我認爲額外的信息不會受到傷害。它是有道理的,我的應用程序域正在關閉發佈,但沒有在調試? – blenddd

回答

3

你的計時器運行這可能是好的,但你的測試方法是有缺陷的。

在ASP.NET應用程序的發佈模式下寫入Console.WriteLine的數據丟失。請參閱此問題的答案:Where does Console.WriteLine go in ASP.net production environment?

如果您確實想使用Console.WriteLine,則可以使用Console.SetOut將輸出重定向到文件。

此外,請確保您的timer對象沒有在方法內聲明,因爲方法完成後它就會被銷燬。

+0

我嘗試了不同的東西,包括拋出異常......在發佈版本中沒有任何反應,並且調試仍然正常工作 – blenddd

+1

定時器的Elapsed事件運行在不同的線程中。沒有什麼可以捕捉到異常,所以線程會死掉,但不是整個應用程序。未處理的異常*可能會顯示在Windows應用程序事件日誌中。 –

+0

我在應用程序啓動時會出現這種情況,所以應用程序應該拋出一個異常,這種異常確實發生在調試模式中,但不在發行版中。 – blenddd

0

您的計時器設置爲1ms。這可能會產生一些不可預知的結果,因爲「分辨率」(計時器檢查的時間間隔)通常約爲15毫秒。如果你只是想測試一個計時器的行爲,那麼我會把它增加到20ms或更多。

我測試了這個。運行500ms的1ms間隔持續運行32次 - 大約每15ms運行一次。這在調試和發佈中是一樣的。沒有例外被拋出。

而不是寫入控制檯,我建議將項目添加到一個全局可訪問ConcurrentQueue當定時器結束的(因爲這是隻是爲了測試/實驗。)

然後一個網頁,你可以輸出的內容上的隊列。您可能想要先停止計時器,以免它將物品放入隊列中。 (或者只是使用更長的時間間隔。)

+0

現在試過了,沒有幫助 – blenddd

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); 
     } 
    } 

即將到來的具體問題,驗證計時器變量的範圍是否是方法的本地。如果這是真的,你可以保持它如上所示活着。

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

相關問題