Pregunta

Estoy leyendo datos de una secuencia (proporcionada por un proceso) carácter por carácter y los agrego a un cuadro de texto para que el usuario pueda verlos. El único problema es que esto es LENTO . El usuario necesita ver los datos que se le dan al programa (con poco o ningún retraso). Me gustaría algo así como cómo los terminales manejan el texto, puede desplazarse tan rápido que es borroso.

¿Cómo puedo mejorar esto?

Como referencia, estoy usando C # .net3.5 y winforms.

¿Fue útil?

Solución

La propiedad Text del cuadro de texto es una cadena, y las cadenas son inmutables (lo que significa que no puede cambiar una cadena). Esto significa que cada vez que agregue un carácter, creará una nueva copia de la cadena con un carácter agregado al final.

Si, por ejemplo, tiene 10000 caracteres en el cuadro de texto, copiará 20kB de datos para agregar el siguiente carácter. Agregar cien caracteres de uno en uno significa copiar 2 MB de datos.

Si los datos se basan en líneas, use una lista en lugar de un cuadro de texto, de modo que solo tenga que actualizar la última línea cuando agregue un carácter.

Otros consejos

En un cuadro de texto de varias líneas obtendrá un rendimiento ligeramente mejor al usar la Selección para agregar caracteres:

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

Pero como puede ver, tendrá que rastrear la longitud usted mismo y este método probablemente se romperá si permite caracteres de control (como el espacio de retroceso).

Recomendaría la idea de Guffa de usar primero un cuadro de lista.

Algún código ayudaría a descubrir cuál es el cuello de botella.

Dicho esto, probaría algo en este sentido (no sugeriría copiar / pegar ya que no puedo probarlo aquí):

// 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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top