保持输入行始终处于活动状态

时间:2018-02-17 00:42:14

标签: c# .net command-line-interface

我正在用C#开发一个CLI应用程序,它基本上有一个从套接字读取数据并打印到屏幕的线程。在线程之外,有一条Console.ReadLine();行应该用于客户端输入。问题是:每次从服务器读取数据并打印到控制台时,我为Console.ReadLine();编写的任何内容都会丢失,因为它最终会像这样:

server message
server message
client messagserver message
server message

那么,有没有办法让输入行始终保持在底部,而来自服务器的数据正在其上方打印?

2 个答案:

答案 0 :(得分:0)

这是可能的,但您需要使用Console.SetCursorPosition将光标移动到屏幕底部,然后在打印服务器消息时再将其移回。您可能还希望使用ReadKey一次捕获一个键,以便您可以管理它实际打印的位置等。实现起来并不是一件容易的事。请参阅https://msdn.microsoft.com/en-us/library/system.console.setcursorposition(v=vs.110).aspx作为起点。

https://github.com/Thraka/SadConsole这样的包可能是另一种方法。如果您在大约2分钟的时间内查看他们的演示视频(https://www.youtube.com/watch?v=ZukjZIqDfJw&feature=youtu.be),看起来他们正在按照您的要求进行操作。

答案 1 :(得分:0)

可能处理此问题的一个好方法是通过线程安全的控制台编写器路由所有输出,以防止多个线程同时写入消息,这可能导致屏幕上的消息重叠。

e.g。

public static class MyConsoleWriter {     static object _locker = new object();

public static void WriteLine (string message)
{
    lock (_locker)
    {
        Console.WriteLine (message);
    } 
}

}

改进版本可能会将所有消息放入List<>并稍后通过不同的线程写入屏幕,从而避免每次调用者lock