RichTextBox BeginUpdate () EndUpdate () Los métodos de extensión no funcionan

Tengo un richTextBox que estoy usando para realizar algunos resaltados de syntax. Esta es una pequeña instalación de edición, por lo que no he escrito un resaltador de syntax personalizado. En su lugar, estoy usando Regex s y actualizando la detección de un retardo de entrada usando un controlador de eventos para el evento Application.Idle :

 Application.Idle += new EventHandler(Application_Idle); 

en el controlador de eventos, compruebo la hora en que el cuadro de texto ha estado inactivo:

 private void Application_Idle(object sender, EventArgs e) { // Get time since last syntax update. double timeRtb1 = DateTime.Now.Subtract(_lastChangeRtb1).TotalMilliseconds; // If required highlight syntax. if (timeRtb1 > MINIMUM_UPDATE_DELAY) { HighlightSyntax(ref richTextBox1); _lastChangeRtb1 = DateTime.MaxValue; } } 

Pero incluso para aspectos relativamente pequeños, el RichTextBox parpadea mucho y no tiene richTextBox.BeginUpdate()/EndUpdate() . Para superar esto, encontré esta respuesta a un dilema similar de Hans Passant (¡Hans Passant nunca me ha decepcionado!):

 using System; using System.Windows.Forms; using System.Runtime.InteropServices; class MyRichTextBox : RichTextBox { public void BeginUpdate() { SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero); } public void EndUpdate() { SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); } [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); private const int WM_SETREDRAW = 0x0b; } 

Sin embargo, esto me da un comportamiento extraño en una actualización; el cursor muere / se congela y no muestra más que rayas de aspecto extraño (vea la imagen a continuación).

Error impar causado por la extensión del método RichTextBox

Claramente no puedo usar un hilo alternativo para actualizar la interfaz de usuario, así que, ¿qué estoy haciendo mal aquí?

Gracias por tu tiempo.

Intente modificar el EndUpdate para llamar también Invalidate después. El control no sabe que necesita hacer algunas actualizaciones, por lo que debe indicarlo:

 public void EndUpdate() { SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); this.Invalidate(); }