2011-03-16 11 views
5

Estoy usando un cuadro de texto de líneas múltiples en C# para simplemente registrar algo de información de rastreo. Simplemente uso AppendText("text-goes-here\r\n") ya que necesito agregar líneas.Problema con el uso de memoria de cuadro de texto multilínea C#

He dejado que este programa se ejecute durante unos días (con un montón de rastreo activo) y noté que estaba usando mucha memoria. En pocas palabras, parece que incluso con el valor máximo de algo muy pequeño (256), el contenido del cuadro de texto sigue expandiéndose.

Pensé que funcionaba como un FIFO (tirando el texto más antiguo que excede el tamaño máximo). No lo hace, simplemente sigue aumentando de tamaño. Esta es aparentemente la causa de mi pérdida de memoria. ¿Alguien sabe lo que estoy haciendo mal?


añadido unas pocas horas después de la pregunta inicial ... Ok, probé el código se sugiere a continuación. Para probarlo rápidamente, simplemente agregué un temporizador a mi aplicación y desde ese tic del temporizador ahora llamo a un método que básicamente hace lo mismo que el siguiente código. La tasa de tics es alta para que pueda observar el uso de memoria del proceso y determinar rápidamente si hay una fuga. No hubo. Eso era bueno; sin embargo, puse esto en mi aplicación y el uso de la memoria no cambió (aún goteaba). Eso parece implicar que tengo una fuga en otra parte :-(Sin embargo, si simplemente agrego una devolución en la parte superior de ese método, el uso vuelve a ser estable. ¿Alguna idea sobre esto? El código invocado por el temporizador-marcado No acumulo memoria, pero mi código real (el mismo método) sí. La diferencia es que estoy llamando al método desde una variedad de lugares diferentes en el código real. ¿Puede el contexto de la llamada afectar esto de alguna manera? (tenga en cuenta, si no lo está) ya es obvio, no soy un experto .NET de ninguna manera) ...

+0

¿Hay alguna razón por la que está tratando de usar un cuadro de texto y no lo registra en una base de datos o lo escribe en un registro de eventos? – Thyamine

+0

Este es un problema común en ASP.NET, ya que los cuadros de texto multilínea se representan en el lado del cliente como un control HTML 'TEXTAREA', que felizmente ignora propiedades como maxlength. Supongo que esto es winforms, sin embargo? – MusiGenesis

+0

Thyamine .. el motivo es la simplicidad. Solo quiero poder ver algún rastro de tiempo de ejecución de un programa; y esperaba que AppendText() actuara como un FIFO. –

Respuesta

2

TextBox le permitirá agregar texto independientemente del valor de MaxLength, solo se usa para controlar la entrada de usuario. Puede crear un método que agregará texto nuevo después de verificar que no se alcanza la longitud máxima, y ​​si lo está, solo elimine x líneas desde el principio.

+0

Acabo de probarlo. La propiedad de cadena subyacente en el TextBox devuelve la cadena completa independientemente de la propiedad maxLength. –

+0

Esto me sorprende. Estaba imaginando que debe haber alguna manera de poner el AppendText en modo FIFO, usando maxlength como el tamaño. –

+0

@Ed - seguro que hay una manera - la que sugerí y @Varun Chatterji implementado en su respuesta :) Pero no se construyó en la forma de hacerlo. – Andrey

2

Usted c debería usar una función simple para anexar texto:

int maxLength = 256; 
private void AppendText(string text) 
{ 
    textBox1.AppendText(text); 
    if(textBox1.Text.Length > maxLength) 
     textBox1.Text = textBox1.Text.Substring(textBox1.Text.Length - maxLength); 
} 
+0

Esto funciona, pero seguro que parece mucho trabajo, especialmente cuando agrego el hecho de que necesito que el cuadro de texto se desplace hasta el final cada vez que se alcanza maxLength. ¡Gracias! Pero esperaba que hubiera una mejor manera. –

+0

Ver mi texto agregado en la parte superior de esta publicación .... –

Cuestiones relacionadas