Timer事件处理程序不在控制台上写入

时间:2013-03-01 12:52:36

标签: c# timer

我知道这可能很奇怪,但我有一个计时器,我有一个事件处理程序,用于在控制台上写入的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");
    }

如果我没有提到足够的信息,请通知我。

3 个答案:

答案 0 :(得分:8)

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

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

只有在满足某个条件时才可以使用某种等待句柄退出应用程序。

答案 1 :(得分:3)

尝试从第一个线程写一个空字符串,然后再做其他事情, 从而初始化控制台:

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 :(得分:2)

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

看起来Console的初始化有点破坏 - 对它的第一次调用将有效地取消锁定直到它完成,从而阻止任何其他控制台访问。

如果你写:

Console.WriteLine("Starting");
例如,在代码开头的

一切都会好的。它不像ReadKey(或任何其他读取操作)阻止所有控制台输出一般 - 它只是在第一次调用中。