c#控制台输入与输出混合

时间:2016-06-06 02:09:30

标签: c# multithreading console

我在控制台c#中编写了一个简单的聊天应用程序,它是多线程的,允许输入和输出同时工作。但是,我的控制台输入通常与控制台输出混合在一起,因为它是多线程的。

例如:

enter image description here

有没有办法解决这个问题,这样我的控制台输出仍然可以写入并且不会干扰我的输入?我想将它保存在控制台中,但如果需要,我可以转到更加图形化的界面。

2 个答案:

答案 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