2012-04-07 7 views
0

Also ich benutze C# jetzt für einen Tag. Die erste Anwendung, die ich schreibe, ist ein einfacher Konsolen-basierter IRC-Client, aber es ist schwieriger, als ich dachte. Da ich von zwei Streams lesen: Konsole & IRC-Server Ich brauche eine Art von nicht blockierenden E/A.Netzwerkblockierung auf nicht blockierend, nur Threads als Option?

Im Moment habe ich den folgenden Code haben:

while (((sInput = sr.ReadLine()) != null) || ((uuInput = Console.ReadLine()) != null)) 
       { 
        // stuff 
       } 

Dies wird jedoch immer sInput halten, weil .ReadLine() ist blockiert und so schließlich True zurück, am Ende, so dass der zweite Block der OR wird nie ausgeführt werden.

Was ist die Lösung dafür? Implementiere ich es selbst mit Threads? Ich kann anscheinend keine NIO-Bibliothek in der Standard-C# -Bibliothek finden. Ich bevorzuge eine kleine, saubere Lösung, weil ich dieses Programm nicht zu kompliziert machen möchte.

Jede Hilfe wäre sehr nett. Vielen Dank.

+0

Nur zur Info: Was Sie suchen, ist die Verarbeitung von IO mit asynchronen Aufrufen; Sie möchten keine nicht blockierenden Sockets. –

Antwort

1

Sie sind definitiv in die Tiefe gesprungen, wenn es darum geht, C# zu lernen. Auf der Grundlage der von Ihnen gesetzten Frage-Tags gehe ich davon aus, dass Sie mehr Hilfe mit der Netzwerkseite haben als die direkten Eingabe-/Ausgabeprobleme. Es wäre fair zu sagen, dass Vernetzung in welcher Sprache Sie verwenden, ist definitiv nicht trivial. Vielleicht ist der beste Weg, Ihnen zu helfen, Sie in die Richtung eines Beispiels zu führen, das zeigt, was Sie zu implementieren versuchen. networkComms.net, eine Open-Source-Netzwerkbibliothek hat als eines der Beispiele eine Chat-Anwendung, here (nur 11 Zeilen lang). Wenn Sie nach dem Auschecken Fragen haben, lassen Sie es mich wissen.

0

Sie könnten versuchen, asynchrone Operationen wie BeginRead() zu verwenden, aber das würde bedeuten, Stream anstelle von StreamReader zu verwenden.

Also ich denke, dass in Ihrem Fall, ja, wäre es am einfachsten, wenn Sie einen anderen Thread erstellt und führte den anderen blockierenden Anruf dort. Aber wenn Sie das tun, vergessen Sie nicht, den Zugriff auf Ressourcen zu synchronisieren, die von den beiden Threads gemeinsam genutzt werden, wahrscheinlich unter Verwendung einer lock.

Verwandte Themen