2013-03-29 24 views
1

我想跟隨一個C#教程的例子來從定時器類觸發事件時,一定的時間已經過去,但它似乎並沒有工作。
下面是代碼:ElapsedEventHandler沒有提出

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Timers.Timer tmr = new System.Timers.Timer(); 
     tmr.Elapsed += new ElapsedEventHandler(TimerTickHandler); 
     tmr.Interval = 1000; 
     tmr.Enabled = true; 
     Console.ReadKey(); 
    } 

    public static void TimerTickHandler(object sender, ElapsedEventArgs e) 
    { 
     Console.Write("\rprinting: {0}", e.SignalTime.ToString()); 
    } 

} 

我附TimerTickHandler上經過的事件和每個之後第二個應該打印的時間到屏幕上,但我沒有得到任何輸出。
任何線索我要去哪裏錯了?
感謝您的幫助。

+2

然而,.NET 4.5變化的其他情況下,ReadKey()需要一個鎖阻止其他線程寫入控制檯。您的處理程序*執行*,它在輸入模式下無法向控制檯報告。用調試器設置一個斷點來看看這個。 –

+0

我想我應該報告這是一個錯誤,如果它還沒有被報告。 –

回答

3

通過將Console.ReadKey()更改爲Console.ReadLine()來解決此問題。

這是a thread discussing why Console.ReadKey() has strange effects on multithreading in Console apps

本質上,Console.ReadKey()鎖定了一個內部對象,其中Console.Write()也試圖鎖定。所以當計時器關閉時,您用於報告的Console.Write()塊因爲Console.ReadKey()鎖定了Console.Write()想要使用的同一個對象。

我認爲這是一個在Console.ReadKey()中的錯誤。恕我直言,在等待I/O時持有鎖總是一個錯誤。

另外請注意,如果你改變了Console.Write()Debug.WriteLine()並附加一個調試器,它也將即使你離開Console.ReadKey()工作。

+0

輝煌,這是整理它。解釋會很好:-)。 –

+0

不知道這個! – McDonnellDean