关于c#:控制台应用程序中的倒数计时器

Countdown timer in console Application

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
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.SetCursorPosition();。当您确定将超过计时器的字符数时,此选项适用。

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

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
2
3
4
5
6
for (int a = 10; a >= 0; a--)
{
    Console.Write("
Generating Preview in {0:00}"
, a);
    System.Threading.Thread.Sleep(1000);
}


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

1
2
3
4
5
6
7
8
9
10
static void Main(string[] args)
{
    Console.WriteLine("This text stays here");
    for (int a = 10; a >= 0; a--)
    {
        Console.Write("
Generating Preview in {0}"
, a);
        System.Threading.Thread.Sleep(1000);
    }
}

console.setCursorPosition和Related是您可能需要的。获取当前位置,并在每次Write/WriteLine调用时再次将其设置回aster。

比如:

1
2
3
4
5
6
7
8
9
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.....");