【问题标题】:Never ending while loop永无止境的while循环
【发布时间】:2023-03-22 06:54:01
【问题描述】:

这是一本 C# 书籍中的示例:

//  Timer02.cs - Displaying Date and Time
//      Using the Timer class. 
//      Press Ctrl+C or 'q' folllwed by Enter to end program. 
//------------------------------------------------------------
using System;
using System.Timers;

class myApp
{
    public static void Main()
    {
        Timer myTimer = new Timer();
        myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
        myTimer.Interval = 1000;
        myTimer.Start();


        while (Console.Read() != 'q')
        {
            ;    // do nothing...
        }
    }

    public static void DisplayTimeEvent(object source, ElapsedEventArgs e)
    {
        Console.Write("\r{0}", DateTime.Now);
    }
}

我猜应该是循环一直运行到 q 被按下,但是当 q 被按下时循环并没有结束。

我在这里缺少什么?

【问题讨论】:

  • 回车结束程序。
  • 您可以添加回车结束它,或者使用我下面的示例仅使用 q 键。

标签: c# timer while-loop


【解决方案1】:

编辑:我发布的方法在按下其他键之前从未打印过消息。

但是这会起作用....

public static void Main()
    {
        Timer myTimer = new Timer();
        myTimer.Elapsed += new ElapsedEventHandler(DisplayTimeEvent);
        myTimer.Interval = 1000;
        myTimer.Start();

        while (true)
        {
            if (Console.KeyAvailable)
            {
                while (Console.ReadKey().KeyChar != 'q')
                {
                    // do nothing
                }
                break;
            }
        }
    }

这里的关键是使用:Console.ReadKey().KeyChar != 'q'

【讨论】:

  • 这完全没有必要,与问题无关。
  • 已修复...抱歉。不过,并不是真的无关紧要,如果计时器被阻塞,它就永远不会退出。
  • 感谢您提供替代解决方案。
  • “如果计时器被阻塞”是什么意思?这里没有前台线程来阻止进程退出。
【解决方案2】:

我怀疑你在q 之后没有按回车键。 Console.Read 方法会阻塞,直到有整行要读取,即使它实际上只读取该行的单个字符。

来自文档:

当您键入输入字符时,Read 方法会阻止其返回;当你按下 Enter 键时它会终止。

【讨论】:

  • 非常简单但真实,因为我在 q 之后按了 ENTER,它完成了它应该做的事情 - 终止循环。谢谢。
猜你喜欢
  • 2019-03-03
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多