【问题标题】:Timer event handler doesn't write on console计时器事件处理程序不在控制台上写入
【发布时间】:2013-02-15 23:39:45
【问题描述】:

我知道这可能很奇怪,但是我有一个计时器,并且我有一个用于在控制台上写入的 Elapsed 事件的事件处理程序,但是当我启动应用程序时,计时器正确启动,事件也正确触发。但是,结果不会显示在控制台中,除非我按下一个按钮,这让我输入了两个 Console.ReadKey(),所以应用程序不会终止。

这是Program.cs中的代码:

    static void Main(string[] args)
    {
        Timer timer = new Timer(100);
        timer.Elapsed += new ElapsedEventHandler(WriteOnConsole);
        timer.Start();
        Console.ReadKey();
        Console.ReadKey();
    }

    static void WriteOnConsole(object source, ElapsedEventArgs e)
    {
        Console.WriteLine("A B C D");
    }

如果我没有提到足够的信息,请告诉我。

【问题讨论】:

  • 你的定时器是什么类型的?哪个计时器类(System.Timers、System.Threading....等)?
  • 那么,你的问题是什么?
  • 你到底想达到什么目的?
  • @ken2k,我认为它来自事件和构造函数的System.Timers.Timer

标签: c# timer


【解决方案1】:

尝试从第一个线程中写入一个空字符串,然后再进行其他操作, 从而初始化控制台:

static void Main(string[] args)
{
    Console.Write(string.Empty);
    Timer timer = new Timer(100);
    timer.Elapsed += new ElapsedEventHandler(WriteOnConsole);
    timer.Start();
    Console.ReadKey();
    Console.ReadKey();
}

static void WriteOnConsole(object source, ElapsedEventArgs e)
{
    Console.WriteLine("A B C D");
}

【讨论】:

    【解决方案2】:

    我在另一个问题中看到了这一点 - 您甚至不需要计时器,只需 任何两个线程,其中一个线程从控制台读取,另一个线程正在写入。

    看起来Console 的初始化有些损坏 - first 调用它会有效地取出锁,直到它完成,阻止任何其他控制台访问。

    如果你写:

    Console.WriteLine("Starting");
    

    例如,在您的代码开始时,一切都会好起来的。这不像ReadKey(或任何其他读取操作)一般会阻塞所有控制台输出 - 它只是在第一次调用中。

    【讨论】:

    • 我无法重现:OP 的代码在我的机器上运行良好(编辑:我的意思是它直接输出到控制台而无需按键)
    • 这是一个竞争条件,它似乎只发生在某些系统上。
    【解决方案3】:

    ReadKey() 阻止 WriteLine()。按下一个键后,第一个 ReadKey 完成并刷新控制台的挂起写入。

    由于这显然只是一个小样本来证明问题,因此很难提出更好的替代方案。

    一种可能是使用某种等待句柄仅在满足特定条件时退出应用程序。

    【讨论】:

    • 但只有第一个。只有当你还没有写过它。基本上,我认为控制台的初始化方式有些奇怪。
    • @JonSkeet:你指的是哪个“第一个”?第一个ReadKey 还是第一个WriteLine
    • 巧合的是,我认为这与我昨天问的事情相同:stackoverflow.com/questions/15143931/…
    • @DanielHilgarth:第一个ReadKey。注意第二个ReadKey 调用不会阻止任何东西。
    • @JonSkeet 第一个ReadKey在我的机器上也没有阻止任何东西。
    猜你喜欢
    • 2010-10-20
    • 2010-11-20
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多