我在控制台c#中编写了一个简单的聊天应用程序,它是多线程的,允许输入和输出同时工作。但是,我的控制台输入通常与控制台输出混合在一起,因为它是多线程的。
例如:
有没有办法解决这个问题,这样我的控制台输出仍然可以写入并且不会干扰我的输入?我想将它保存在控制台中,但如果需要,我可以转到更加图形化的界面。
答案 0 :(得分:1)
保存用户键入的内容,当收到消息时,使用写入\ b字符(退格键)清除输入,然后打印传入消息,然后恢复用户输入,以便继续输入。
以下是一些基本代码来说明这个想法:
class Program
{
static object locker = new object();
static List<char> buffer = new List<char>();
static void Main(string[] args)
{
new Thread(Chat).Start("John");
string ourName = "Mike";
buffer.AddRange(ourName + ": ");
Console.Write(new string(buffer.ToArray()));
while (true)
{
var k = Console.ReadKey();
if (k.Key == ConsoleKey.Enter && buffer.Count > 0)
{
lock (locker)
{
Console.WriteLine();
buffer.Clear();
buffer.AddRange(ourName + ": ");
Console.Write(buffer.ToArray());
}
}
else
{
buffer.Add(k.KeyChar);
}
}
}
static Random rnd = new Random();
static void Chat(object name)
{
var dlg = new[] { "Hello", "How are you", "I'm all right", "What a nice day" };
while (true)
{
Thread.Sleep(3000 + rnd.Next(5000));
lock (locker)
{
Console.Write(new string('\b', buffer.Count));
var msg = name + ": " + dlg[rnd.Next(dlg.Length)];
var excess = buffer.Count - msg.Length;
if (excess > 0) msg += new string(' ', excess);
Console.WriteLine(msg);
Console.Write(new string(buffer.ToArray()));
}
}
}
}
答案 1 :(得分:-1)
这不是一个多线程问题,这是Windows上命令提示符如何工作的问题。如果你在Windows 10上我会建议切换到canocal bash,你的问题就会消失。如果在Windows 10下面通过Git或cygwin下载正常终端。
没有答案的相关问题
how to handle different input/output in one console?
Prevent mixing of console output and written text