4

我知道这可能很奇怪,但是我有一个计时器,并且我有一个在控制台上写入的 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");
    }

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

4

3 回答 3

8

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

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

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

于 2013-03-01T12:55:12.350 回答
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");
}
于 2013-03-01T12:58:39.533 回答
2

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

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

如果你写:

Console.WriteLine("Starting");

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

于 2013-03-01T12:58:04.950 回答