2016-06-06 7 views
1

Ich habe eine einfache Chat-Anwendung in Konsole C# geschrieben, die Multi-Threaded ist und es ermöglicht, dass Eingabe und Ausgabe gleichzeitig funktionieren. Meine Konsoleneingabe wird jedoch häufig mit der Konsolenausgabe gemischt, da sie multi-threaded ist.C# Konsoleneingang gemischt mit Ausgabe

Beispiel:

enter image description here

Gibt es eine Möglichkeit, dies zu lösen, so dass meine Konsolenausgabe noch geschrieben werden kann und nicht mit meinem Eingang stören? Ich möchte es in der Konsole behalten, aber ich kann bei Bedarf zu einer graphischeren Schnittstelle wechseln.

+2

könnten Sie bitte den Code enthalten, dass Sie so weit –

Antwort

1

speichern, was durch den Benutzer eingegeben wird, und wenn eine Nachricht, klare Eingang mit dem Schreiben \ b Zeichen (Backspace) kommt, dann die eingehende Nachricht drucken und dann die Eingabe des Benutzers wiederherzustellen, damit es weiter könnte Art.

Hier einige grundlegende Code, um die Idee zu veranschaulichen:

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())); 
      } 
     } 
    } 
} 
+0

Dank getan haben, ist dies für mich gearbeitet! – BlackKnyght