控制台应用程序中的倒计时计时器

9

我有一个控制台应用程序,想要创建一个倒计时计时器。以下是我尝试过的方法:

    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();
        }
    }

这段代码在某些情况下是可行的。然而,问题在于它会清除整个控制台窗口,当计时器上面有一些字符时就无法使用。


1
不要使用Console.Clear(),而是在你的实际文本行中使用\r... - John Bustos
4个回答

17
如果你在控制台中打印 "\r",光标会回到当前行的开头位置,所以以下代码可行:
for (int a = 10; a >= 0; a--)
{
    Console.Write("\rGenerating Preview in {0:00}", a);
    System.Threading.Thread.Sleep(1000);
} 

1
很好的答案,但是有一个小错误。计时器会显示10、90、80、70...在字符串末尾填充一个空格,一切都会正常显示。 - Derek W

10

我知道两种实现你想要的方法

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);
   }
}

1
你也可以使用 Console.Write( "Generating Preview in {0:00}", a );始终以两位数字显示计时器的值。这样,您就不需要在末尾添加空格以确保完全覆盖先前的两位数字。 - Marcus Mangelsdorf

2

Console.SetCursorPosition及其相关内容可能是您正在寻找的。它可以获取当前光标位置并在每次Write/WriteLine调用后再次设置。

例如:

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.....");

这仍然会清除计时器上方的任何文本。 - user2399866
@TijesunimiPreciousAmesinlola 只需删除 .Clear 调用... 这是复制/粘贴错误。 - Alexei Levenkov

2

你可以使用一个简单的技巧,在字符串中插入\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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接