定时器事件处理程序不写入控制台

本文关键字:控制台 事件处理 程序 定时器 | 更新日期: 2023-09-27 18:01:55

我知道这可能是奇怪的,但我有一个计时器,我有一个事件处理程序的流逝事件,写在控制台,但当我启动应用程序,计时器启动正确,事件火灾正确,太。但是,结果不会显示在控制台中,除非在我按下按钮之后,这让我放了两个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");
    }

如果我没有提供足够的信息,请告知我。

定时器事件处理程序不写入控制台

ReadKey()阻塞WriteLine()。按下一个键后,第一个ReadKey完成,对控制台的挂起写操作被刷新。

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

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

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

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");
}

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

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

如果你写:

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

,一切都可以。它不像ReadKey(或任何其他读操作)阻塞所有控制台输出一般 -它只是在第一个调用