如何在等待ReadLine时更新C#Windows控制台应用程序中的当前行?

How can I update the current line in a C# Windows Console App while waiting for ReadLine?

在C_中构建Windows控制台应用程序时,是否可以在等待读取行时更新控制台中的行?

我当前的代码是:

1
2
3
4
5
6
7
8
do
{
    Console.Clear();
    Console.WriteLine("RA:    " + scope.RightAscension);
    Console.WriteLine("Dec:   " + scope.Declination);
    Console.WriteLine("Status:" + scope.Slewing);
    System.Threading.Thread.Sleep(1000);
} while (true);

对。在console.readline上阻塞时,可以从单独的线程写入控制台。

尽管如此,这会引起混乱。在您的例子中,您将清除用户在其行中键入的内容(通过console.clear()),然后显著地移动光标位置。

编辑:下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
namespace ConsoleApplication1
{
    using System;
    using System.Threading;

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Starting");

            ThreadPool.QueueUserWorkItem(
                cb =>
                    {
                        int i = 1;
                        while (true)
                        {
                            Console.WriteLine("Background {0}", i++);
                            Thread.Sleep(1000);
                        }
                    });
            Console.WriteLine("Blocking");
            Console.WriteLine("Press Enter to exit...");
            Console.ReadLine();
        }
    }
}

如果您运行这个,您将看到控制台在readline上等待,但是后台线程仍然会打印出来。


使用循环内的console.keyAvailable。一旦返回true,用户就开始键入,所以调用readline()。不过,这并不是一个非常有吸引力的用户界面。考虑Windows窗体。


此解决方案是否可以帮助您:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace WaitForExit
{
    class Program
    {
        static void Main(string[] args)
        {
            new Thread(() =>
                {
                    Console.ReadLine();
                    Environment.Exit(0);
                }).Start();

            int i = 0;
            while (true)
            {
                Console.Clear();
                Console.WriteLine(++i);
                Thread.Sleep(1000);
            }
        }
    }
}