2011-01-10 12 views
2

Ich habe eine App geschrieben, die eingehenden Chat liest (etwas wie ein Instant Messenger), formatiert es und fügt es in eine Richtextbox ein. Wenn Sie das Programm lange genug laufen lassen, erhalten Sie einen Speichermangel. Nachdem ich meinen Code angeschaut habe, denke ich, dass ich die Richtextbox niemals beschneide. Das Problem, auf das ich stoße, ist, dass ich nicht clear() aufrufen möchte, weil ich nicht möchte, dass der sichtbare Text verschwindet. Ich dachte, vielleicht sollte ich eine Liste mit einer maximalen Größe von etwa 200 Zeilen führen. Diese Liste würde den letzten Chat behalten. Wenn das Chatprotokoll zu groß wird, rufen Sie clear auf und fügen Sie die letzten 200 Zeilen erneut ein. Bevor ich jedoch diesen Gedanken ausführe, frage ich, ob jemand eine bessere Lösung kennt. Irgendwelche Gedanken?C# richtextbox outofmemory

+0

Die MaxLength-Eigenschaft ist wahrscheinlich am ehesten für die Steuerung des Strings verantwortlich. Aber es ist wahrscheinlich eine schlechte Wahl. Im Grunde genommen scheint es am besten zu sein, es selbst zu verwalten. – doobop

+0

Wirklich? Du hast nicht mehr genug Speicher, nur um zu chatten? Senden Ihre Nutzer Chats per Megabyte ?! – Mehrdad

+0

Das ist, was ich zuerst dachte, passiert nicht sofort, hängt davon ab, wie viel Speicher Sie haben. Für mich musste meine App für ein paar Tage geöffnet sein, aber einer meiner Freunde, der nur 1 Gig-Speicher hat, sagt, dass er innerhalb von 8 Stunden mit einer Ausnahme wegen zu wenig Speicher abstürzen würde. Da ich die Änderung gemacht habe, scheint es richtig zu funktionieren – poco

Antwort

3

würde ich wahrscheinlich wie folgt vor:

  1. Catch the RichTextBox.TextChanged Ereignis
  2. in dem Handler, überprüfen Sie die Anzahl der Zeilen (RichTextBox.Lines.Length)
  3. Wenn dies Ihr Maximum überschreitet, entfernen Sie das erste.

Viel Glück!

+0

Danke, das funktioniert perfekt – poco

0

Während ich mit der akzeptierten Antwort zustimmen, wollte ich ein Codebeispiel schaffen eine Klarstellung zu zeigen:

private void rtbChatWindow_TextChanged(object sender, EventArgs e) 
{ 
    int maxLines = 200; 

    if (rtbChatWindow.Lines.Length > maxLines) 
    { 
     string s = rtbChatWindow.Lines.First(); 
     rtbChatWindow.Text = rtbChatWindow.Text.Remove(0, s.Length).Trim(); 
    } 
} 

Stellen Sie sicher, rufen Trim(), nachdem Sie den Text entfernen, ansonsten wird die erste Textzeile wird Leerzeichen, was dazu führt, dass dies nicht funktioniert.