C# 控制台:边读边写并保留结构

Cri*_*oma 6 c# console multithreading client-server

我正在编写一个通过 TCP 连接到服务器的 C# 控制台应用程序,它使用一个单独的线程来侦听来自服务器的传入消息,我希望它将它们写入控制台,同时从控制台读取消息。我能够做到这一点,但我有一个问题。

当我输入时,控制台会显示此信息,并出现一条消息:

来自服务器的消息 来自服务器的
消息
我的消息从服务器
g 到服务器

我希望它将我的消息与服务器消息分开,如下所示:

来自服务器的
消息 来自服务器的
消息 来自服务器的
消息 我的消息到服务器

如果我收到一条消息,我仍然想保留我输入的消息,但我不希望它与收到的消息混淆,我希望它在最后一行保持完整。

我可以这样做吗?如何?

当来自服务器的消息传入时,我可以将消息移到控制台的末尾吗?

Nol*_*rin 3

我相信这实际上可以通过标准 .NET Console API 实现,并使用一些技巧。您需要做的是创建一个异步 Read/ReadLine 方法(根据您的帖子判断,我假设您已经完成了)并允许它在新数据到达时立即取消。我假设您现在正在逐行发送输入。“新数据处理程序”的伪代码可能如下所示:

保存当前的输入缓冲区。
取消当前的异步读取。
将光标位置重置到最后一次写入新数据的末尾。
输出新数据。
保存光标位置。
重新启动异步读取事件。

特别是,您需要处理Console.CursorLeftConsole.CursorTop属性。您也许可以通过直接与 Win32 API 控制台函数交互来避免一些黑客行为,但这可能不值得麻烦。

希望有帮助。