ElapsedEventHandler没有提出

时间:2013-03-29 11:28:55

标签: c# events

我正在尝试按照c#教程中的示例,在经过一定时间后从计时器类触发事件,但它似乎不起作用。
这是代码:

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附加到已用事件上,每秒后它应该将时间打印到屏幕上,但我没有得到任何输出。
关于我哪里出错的任何线索?
谢谢你的帮助。

1 个答案:

答案 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()保留在其中也会有效。