¿Cuánto dura la demora entre Control.Invoke () y la llamada de su Delegado?

Tengo un motor de código que reproduce archivos WAV largos al reproducir fragmentos más pequeños en sucesión usando los métodos de API waveOutOpen y waveOutWrite. Para actualizar mi interfaz de usuario a medida que se reproduce el archivo, desde la función de callback a medida que cada búfer finaliza la reproducción, Invoco una secuencia separada (porque desea hacer lo menos posible dentro de la función de callback) que llama a un método en mi formulario.

El formulario contiene un EventHandler nivel de clase que maneja un método dentro del cual actualizo los elementos de la interfaz de usuario con información nueva. En el método de formulario llamado desde la función de callback waveOutWrite, uso el método Invoke así:

 if (_updatedisplay == null) { // UpdateDisplay contains code to set control properties on the form _updatedisplay = new EventHandler(UpdateDisplay); } Invoke(_updatedisplay); 

Todo funciona, pero parece que de vez en cuando hay un retraso o retraso notable en la actualización de los elementos de la interfaz de usuario. Esto es fácil de ver porque estoy usando el método UpdateDisplay para conducir una animación, por lo que los retrasos aparecen como “contratiempos” donde el sprite parece congelarse por una fracción de segundo antes de que salte a la posición esperada.

¿Es posible que a veces exista un retraso prolongado (tal vez de 10 a 15 milisegundos) involucrado en la comunicación entre hilos como este? Si es así, ¿cuál es una mejor manera de manejar algo como esto?

Actualización : por cierto, definitivamente no estoy seguro de que Invoke sea ​​el culpable aquí. Otra posibilidad es un retraso entre cuando una parte del audio termina de reproducirse y cuando realmente se llama a la función de callback.

Actualización 2 : según la sugerencia de itowlson , utilicé un System.Diagnostics.Stopwatch para comparar el retraso entre Invoke y método call. De las 1156 mediciones, obtuve 1146 a 0 ms, 8 a 1 ms y 2 a 2 ms. Creo que es seguro decir que Invoke no es mi culpable aquí.

Sí, puede haber un retraso arbitrariamente largo. Invocar funciona enviando un mensaje de Windows al control de destino, por lo que solo se procesará cuando el subproceso de destino bombee mensajes. Si el subproceso ya está procesando un mensaje, y ese procesamiento lleva tiempo, entonces puede haber un retraso apreciable antes de que el subproceso bombee su siguiente mensaje y, por lo tanto, procese la Invocación.

Una mejor manera puede ser llamar a BeginInvoke. Esto no evita el posible retraso en el subproceso de la interfaz de usuario que procesa el mensaje, pero evita que el subproceso de la llamada se bloquee mientras se espera que el subproceso de la interfaz de usuario bombee mensajes. Sin embargo, es posible que esto no sea de ayuda en su situación en la que parece que es el ajetreo del subproceso de la interfaz de usuario que está causando fallas en la animación.

Actualice en respuesta a su actualización: tenga en cuenta que todo lo que digo aquí es que podría haber un retraso arbitrariamente largo, no que habrá un retraso notable o que esta es definitivamente la causa de su retraso. 10-15ms parece un tiempo inusualmente largo para que una aplicación invierta en el procesamiento de mensajes, a menos que ocurra algo realmente intenso en el subproceso de la interfaz de usuario, ¡por lo que es sensato considerar causas alternativas!