【问题标题】:ElapsedEventHandler not raisedElapsedEventHandler 未引发
【发布时间】:2013-03-20 02:23:09
【问题描述】:

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

【问题讨论】:

  • .NET 4.5 更改的另一种情况是,ReadKey() 获取了一个锁,以防止其他线程写入控制台。您的处理程序 确实 执行,但它在输入模式下无法向控制台发送信息。使用调试器设置断点以查看此内容。
  • 如果尚未报告,我想我应该将其报告为错误。

标签: c# events


【解决方案1】:

通过将 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() 留在其中,它也可以工作。

【讨论】:

  • 太棒了,这就是它的排序。一个解释会很好:-)。
猜你喜欢
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多