c# - 保持 Console.ReadLine 始终在最后一行

标签 c# multithreading console

我有一个用 C# 编写的应用程序,它通过 while(true) 循环和 Console.ReadLine 不断地从用户那里获取命令。

我也确实有各种通过控制台报告的后台操作。查看这个简单示例:

class Program
{  
        static void Main(string[] args)
        {
            new Messager(1000 * 2.5f);
            new Messager(1000 * 3);
            while (true)
            {
                Console.ReadLine();
            }
        }
}

public class Messager
{
    Timer Timer;

    public Messager(double interval)
    {
        this.Timer = new Timer(interval);
        this.Timer.Elapsed += (sender, e) =>
        {
            Console.WriteLine("message from " + this.Timer.Interval);
        };
        this.Timer.Start();
    }
}

问题是,当我输入一个命令并且在我按下 Enter 之前 Messager 返返回告时,来自 Messager 的消息将附加到我的当前行并且光标将被放置到下一行。看这个截图:

The problem

如您所料,我不希望那样。我希望当前输入的命令始终保留在最后一行,并将所有消息放在该行上方。正如您对此类应用程序的期望一样。我该如何实现?

最佳答案

这很难做到。您最终编写了每个线程都必须调用的自己的控制台输入和输出方法。如果任何线程不合作,它就无法正常工作。但是使用控制台 API 是可能的。

基本思想是让您的通用输出函数写入控制台屏幕缓冲区,并在代码中滚动缓冲区,而不是让文本流到最后一行并自动滚动。我记得,您必须解析换行符和其他控制字符的输出,并正确处理它们。

您可以在最后一行使用 Console.ReadLine,但这样做可能会导致用户输入的文本多于一行无法容纳的文本。此外,用户在行尾按 Enter 可能会导致它向上滚动。在这种情况下最好使用原始控制台输入。

您需要非常熟悉 Windows consoles .

请注意:工作量很大。而且可能不值得付出努力。

关于c# - 保持 Console.ReadLine 始终在最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18060048/

相关文章:

c# - 优化代码(就像在 ruby​​ 中所做的那样),用于在 C# 中交换奇数位置的 2 个数字

c# - 如何测试 MVC View ?

c# - 我的 Microsoft Graph 订阅中有几个 page.count

multithreading - macosx 线程显式标记为已删除

c# - 禁用点击按钮事件c#

c++ - 如何最好地中断 zeroMQ 轮询方法以进行清理和终止

multithreading - Kafka流中通过线程分配的策略是什么?

delphi - 如何在 Delphi 控制台应用程序中处理 Ctrl+C?

C++ 控制台应用程序 MVC

python - 使用 print() 太多会导致它失败吗?