【问题标题】:Using Console.WriteLine in a Timer why it would appear to exit?在 Timer 中使用 Console.WriteLine 为什么会出现退出?
【发布时间】:2013-08-21 12:20:05
【问题描述】:

我有一个控制台应用程序,当我使用Console.ReadLine()时,应用程序会显示“Hello World”。为什么Console.ReadKey()不能?`

static void Main(string[] args)
{
     System.Timers.Timer timer = new System.Timers.Timer(1000);
     timer.Elapsed += timer_Elapsed;
     timer.Enabled = true;

     Console.ReadKey();// When use ReadLine() work fine;
}

static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
     Console.WriteLine("Hello World");
}

固定:http://support.microsoft.com/kb/2805221

【问题讨论】:

  • 我不确定你在问什么。这将基本上每秒显示Hello World,直到您按下一个键。你想要什么?
  • 如果您的计算机上安装了 .NET 4.5,请确保您已启用 Windows 更新。您将获得一个更新,该更新解决了 ReadKey() 锁定阻止 WriteLine() 将文本写入控制台的问题。
  • @HansPassant 是的,你是对的!谢谢。
  • @HansPassant 你能把它发布为答案吗?
  • WU 在 win 8.1 上找不到此更新

标签: c# console-application


【解决方案1】:

Console.ReadKey .NET 4.5 changes may deadlock your system

Console.ReadKey 现在会锁定一个同步对象,当您第一次尝试访问 stderr 时该对象会被锁定。因此,解决方法很简单,我们需要在调用Console.ReadKey之前初始化Console.Error。

更新:An update is available for the .NET Framework 4.5 in Windows 7 SP1, Windows Server 2008 R2 SP1, Windows Server 2008 SP2, and Windows Vista SP2: May 2013

【讨论】:

    【解决方案2】:

    我运行了您的代码,它适用于 Console.ReadKey() 和 Console.ReadLine()

    【讨论】:

      【解决方案3】:

      在这个应用程序中,定时器在另一个线程上运行。另一方面,您的主线程并行执行 Console.ReadKey() 或 Console.ReadLine(),Timer 的线程继续并行运行并定期写入“Hello World”,直到主线程退出。

      如果您输入 Console.ReadKey(),主线程将在键盘按键后退出。
      如果你把 Console.ReadLine() 从键盘按回车键后主线程将退出。

      有关计时器类型的更多信息:http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

      【讨论】:

        猜你喜欢
        • 2020-11-17
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        相关资源
        最近更新 更多