定时器事件处理程序不写入控制台
本文关键字:控制台 事件处理 程序 定时器 | 更新日期: 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
(或任何其他读操作)阻塞所有控制台输出一般 -它只是在第一个调用