1

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

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

4

1 回答 1

3

通过更改Console.ReadKey()为来解决此问题Console.ReadLine()

这是一个讨论为什么Console.ReadKey()对控制台应用程序中的多线程产生奇怪影响的线程

本质上,Console.ReadKey()已经锁定了一个内部对象,该对象Console.Write()也试图锁定。因此,当计时器关闭时,Console.Write()您用来报告它的那个会阻塞,因为Console.ReadKey()已经锁定了Console.Write()想要使用的同一个对象。

我认为这是Console.ReadKey(). 在等待 I/O 时持有锁总是一个错误,恕我直言。

另请注意,如果您更改Console.Write()toDebug.WriteLine()并附加调试器,即使您离开它也可以工作Console.ReadKey()

于 2013-03-29T11:34:20.137 回答