我知道这可能很奇怪,但我有一个计时器,我有一个事件处理程序,用于在控制台上写入的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");
}
如果我没有提到足够的信息,请通知我。
答案 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
(或任何其他读取操作)阻止所有控制台输出一般 - 它只是在第一次调用中。