我正在尝试按照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附加到已用事件上,每秒后它应该将时间打印到屏幕上,但我没有得到任何输出。
关于我哪里出错的任何线索?
谢谢你的帮助。
答案 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()
保留在其中也会有效。