【问题标题】:Countdown timer in console Application [duplicate]控制台应用程序中的倒数计时器[重复]
【发布时间】:2013-08-03 00:23:28
【问题描述】:

我有一个控制台应用程序,我想创建一个倒数计时器。这是我尝试过的:

    static void Main(string[] args)
    {
        for (int a = 10; a >= 0; a--)
        {
            Console.Write("Generating Preview in {0}", a);
            System.Threading.Thread.Sleep(1000);
            Console.Clear();
        }
    }

此代码在某些情况下有效。但是,问题是它会清除整个控制台窗口,并且在计时器上方有一些字符时无法使用。

【问题讨论】:

标签: c# timer console-application


【解决方案1】:

如果您将"\r" 打印到控制台,则光标会返回到当前行的开头,所以这样可以:

for (int a = 10; a >= 0; a--)
{
    Console.Write("\rGenerating Preview in {0:00}", a);
    System.Threading.Thread.Sleep(1000);
} 

【讨论】:

  • 很好的答案,但有一个小错误。计时器将显示 10, 90, 80, 70,... 在字符串末尾填充一个空格,一切都会正常显示。
【解决方案2】:

我知道有两种方法可以做你想做的事

1) 使用Console.SetCursorPosition();。这适用于您确定超过计时器的字符数量。

2) 使用Console.CursorLeft。这适用于所有情况。

代码示例

static void Main(string[] args)
{
   for (int a = 10; a >= 0; a--)
   {
      Console.SetCursorPosition(0,2);
      Console.Write("Generating Preview in {0} ", a);  // Override complete previous contents
      System.Threading.Thread.Sleep(1000);
   }
}

static void Main(string[] args)
{
   Console.Write("Generating Preview in ");
   for (int a = 10; a >= 0; a--)
   {
      Console.CursorLeft = 22;
      Console.Write("{0} ", a );    // Add space to make sure to override previous contents
      System.Threading.Thread.Sleep(1000);
   }
}

【讨论】:

  • 感谢您的解释
  • 您还可以使用Console.Write( "Generating Preview in {0:00}", a );始终以两位数显示计时器值。这样您就不需要在末尾添加空格来确保完全覆盖之前的两位数。
【解决方案3】:

您可以使用的一个简单技巧是在字符串中放置 \r 以将光标返回到当前行的开头:

static void Main(string[] args)
{
    Console.WriteLine("This text stays here");
    for (int a = 10; a >= 0; a--)
    {
        Console.Write("\rGenerating Preview in {0}", a);
        System.Threading.Thread.Sleep(1000);
    }
}

【讨论】:

    【解决方案4】:

    Console.SetCursorPosition 和相关是您可能正在寻找的。每次调用 Write/WriteLine 时获取当前位置并将其重新设置回 aster。

    类似:

    var origRow = Console.CursorTop;
    for (int a = 10; a >= 0; a--)
    {
        Console.SetCursorPosition(0, origRow);
        Console.Write("Generating Preview in {0}", a);
        System.Threading.Thread.Sleep(1000);
    }
    Console.SetCursorPosition(0, origRow);
    Console.Write("Generating Preview done.....");
    

    【讨论】:

    • 这仍然会清除计时器上方的任何文本
    • @TijesunimiPreciousAmesinlola 只需删除 .Clear call... 复制/粘贴错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2011-06-06
    • 2012-06-03
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多