c# performance visual-studio-2005 richtextbox
http://download.microsoft.com/download/4/0/9/40946FEC-EE5C-48C2-8750-B0F8DA1C99A8/MFC/ole/wordpad.zip.exe

C#RichEditBox tiene un rendimiento extremadamente lento(4 minutos de carga)



performance visual-studio-2005 (1)

Descargué el código fuente de Wordpad ( http://download.microsoft.com/download/4/0/9/40946FEC-EE5C-48C2-8750-B0F8DA1C99A8/MFC/ole/wordpad.zip.exe ) y tiene el mismo peor rendimiento (4 minutos). Pero esta muestra es una versión anterior de Wordpad.

Así que Microsoft ha mejorado todo lo que falta en Wordpad en los últimos años en el marco .NET.

Finalmente encontré la solución:

El .NET Framework usa la clase RichEdit20W para el control Richedit como también lo hace el viejo Wordpad. Pero el Wordpad de Windows XP usa el nuevo RichEdit50W que ha sido altamente mejorado por Microsoft.

Entonces, ¿cómo le digo al .NET Framework que use RichEdit50W en lugar de RichEdit20W?

Esto es muy sencillo: obtenga una clase de RichTextBox y escriba un contenedor administrado para LoadLibary.

La clase RichEdit50W es creada por MsftEdit.dll, que está disponible desde Windows XP SP1. Implementé una alternativa a RichEdit20W para el caso muy raro de que alguien todavía deba usar XP sin Service Pack.

¡Y funciona!

/// <summary> /// The framework uses by default "Richedit20W" in RICHED20.DLL. /// This needs 4 minutes to load a 2,5MB RTF file with 45000 lines. /// Richedit50W needs only 2 seconds for the same RTF document !!! /// </summary> protected override CreateParams CreateParams { get { CreateParams i_Params = base.CreateParams; try { // Available since XP SP1 Win32.LoadLibrary("MsftEdit.dll"); // throws // Replace "RichEdit20W" with "RichEdit50W" i_Params.ClassName = "RichEdit50W"; } catch { // Windows XP without any Service Pack. } return i_Params; } }

NOTA: Vea también http://msdn.microsoft.com/en-us/library/windows/desktop/bb787873%28v=vs.85%29.aspx

public class Win32 { [DllImport("kernel32.dll", EntryPoint="LoadLibraryW", CharSet=CharSet.Unicode, SetLastError=true)] private static extern IntPtr LoadLibraryW(string s_File); public static IntPtr LoadLibrary(string s_File) { IntPtr h_Module = LoadLibraryW(s_File); if (h_Module != IntPtr.Zero) return h_Module; int s32_Error = Marshal.GetLastWin32Error(); throw new Win32Exception(s32_Error); } }

El control RichEditBox en C # (utilizo VS 2005) tiene un mal rendimiento. Cargué un archivo RTF de 2,5 MB con 45,000 líneas de texto coloreadas en el control y toma 4 minutos. Cargué el mismo RTF en el control RTF en Wordpad de Windows XP y se carga en 2 segundos.

Wordpad se realiza 120 veces más rápido que mi aplicación.

¿Cuál es el motivo y cómo puedo solucionarlo?