Hay algunas opciones que puede tomar aquí. En primer lugar, puede configurar el doble búfer en el formulario, que terminará dibujando todas las actualizaciones en un mapa de bits subyacente, que luego muestra la imagen recién dibujada (en lugar de dibujar los Controles de forma individual en un objeto gráfico). Vi un aumento de velocidad del 50% con este método. Tirar esto en el constructor:
this.SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,true);
La otra cosa a tener en cuenta es que la concatenación de cadenas es lento para grandes cantidades de datos. Es mejor usar un StringBuilder para compilar los datos y luego simplemente mostrarlos usando StringBuilder.ToString (aunque es aún mejor escalonar las actualizaciones, tal vez una vez cada 100 iteraciones). En mi máquina, simplemente cambiándolo para agregarlo a StringBuilder, pasó de 2.5 minutos a ejecutarse a través de iteraciones de 10k a aproximadamente 1.5 minutos. Mejor, pero aún lento.
new System.Threading.Thread(() =>
{
for(int i = 0; i < 10000; i++)
{
sb.AppendLine(DateTime.Now.ToString());
Invoke((Action)(() =>
{
txtArea.Text = sb.ToString();
txtArea.SelectionStart = txtArea.Text.Length;
txtArea.ScrollToCaret();
}));
}
}).Start();
Finalmente, justo probado a cabo escalonamiento (arrojó una sola condicional en el código anterior, justo antes de la llamada Invoke), y se terminó en 2 segundos. Dado que estamos usando StringBuilder para construir realmente la cadena, aún conservamos todos los datos, pero ahora solo tenemos que hacer las actualizaciones 100 veces en vez de 10k veces.
Entonces, ¿cuáles son sus opciones? Dado que se trata de una aplicación WinForm, puede utilizar uno de los muchos objetos Timer para realizar la actualización de la interfaz de usuario para ese control en particular, o puede mantener un contador de cuántas "lecturas" o "actualizaciones" de los datos subyacentes (en su caso, una secuencia) y solo actualiza la interfaz de usuario en X cantidad de cambios. Utilizar tanto la opción StringBuilder como las actualizaciones escalonadas es probablemente el camino a seguir.
¿Puedes leer tan rápido? No soy. Simplemente actualice el cuadro de texto cada x segundos en lugar de cada marca del reloj. –
Esto fue solo un ejemplo de cómo reproducir el problema (aunque sea un poco extremo). De hecho, estoy leyendo de una transmisión, por lo que las actualizaciones pueden ser rápidas o lentas. – qJake
Todavía mi pregunta y sugerencia siguen siendo las mismas. UI es para acomodar al usuario. –