2009-03-18 16 views
2

Ich lese Daten aus einem Stream (von einem Prozess bereitgestellt) Zeichen für Zeichen und füge es in ein Textfeld, so dass der Benutzer sehen kann. Das einzige Problem ist, das ist SLOW. Der Benutzer muss die Daten so sehen, wie sie dem Programm gegeben werden (mit wenig bis keiner Verzögerung). Ich möchte etwas wie, wie Terminals mit Text umgehen, es kann so schnell scrollen, dass es eine Unschärfe ist.Viele Zeichen lesen und ein Textfeld aktualisieren

Wie kann ich das verbessern?

Als Referenz verwende ich C# .net3.5 und winforms.

Antwort

2

Die Text Eigenschaft des Textfeldes a Zeichenfolge und Zeichenfolgen sind unveränderlich (das bedeutet, dass Sie eine Zeichenfolge nicht ändern können). Das bedeutet, dass Sie jedes Mal, wenn Sie ein Zeichen hinzufügen, eine neue Kopie der Zeichenfolge erstellen, wobei am Ende ein Zeichen hinzugefügt wird.

Wenn Sie zum Beispiel 10000 Zeichen im Textfeld haben, kopieren Sie 20 KB Daten, um das nächste Zeichen hinzuzufügen. Das Hinzufügen von jeweils 100 Zeichen bedeutet das Kopieren von 2 MB Daten.

Wenn die Daten zeilenbasiert sind, verwenden Sie anstelle eines Textfelds eine Liste, sodass Sie beim Hinzufügen eines Zeichens nur die letzte Zeile aktualisieren müssen.

0

Ein Code würde helfen herauszufinden, was der Engpass ist.

Das heißt, ich etwas in dieser Richtung versuchen würde (ich würde nicht copy/paste vorschlagen, wie ich es hier nicht testen):

// Stream s... 
byte[] buffer = new buffet[bufferSize]; 
s.BeginRead(b, 0, buffer.Length, 
    delegate 
     { 
      if (textBox1.InvokeRequired) 
      { 
       textBox1.Invoke(
        new MethodInvoker(
         delegate 
         { 
          textBox1.Text = Encoding.Unicode.GetString(b); 
         })); 
      } 
      else 
      { 
       textBox1.Text = Encoding.Unicode.GetString(b); 
      } 
     }, null); 
1

In einem mehrzeiligen Textfeld Sie die Auswahl etwas bessere Leistung erhalten werden unter Verwendung von Zeichen anhängen:

textBox1.Select(textLength, 0); 
textBox1.Selectedtext = newText; 
textLength += newText.Length; 

Aber wie Sie Sie sich die Länge verfolgen müssen sehen werde und diese Methode wird wahrscheinlich brechen wenn Sie Kontrollzeichen zulassen (wie Rücktaste).

Ich würde Guffas Idee empfehlen, zuerst eine Listbox zu verwenden.

Verwandte Themen