Al ver esta pregunta, puedo ver que no obtendrá ninguna respuesta que solucione el problema de inmediato, ya que la mayoría de ellos requieren que se resuelva el problema, y ocurre con poca frecuencia que esto es casi imposible . Entonces, déjame sugerirte que hagas algunos cambios de código que podrían ayudarte a identificar al culpable en el campo.
Te sugiero que crees una clase estática cuyo único propósito es manejar todas tus llamadas de Invoke. Sugeriría que esta clase tiene un método que toma un Control, (para llamar a invocar) una Acción (el método que se invocará) y una descripción (que contiene la información que necesitaría saber para identificar el método y lo que es va a hacer).
Dentro del cuerpo de este método, le sugiero que coloque esta información (método, descripción) y la devuelva inmediatamente.
La cola debe ser atendida por un solo hilo, que separa el par de acción/mensaje de la cola, registra la hora actual y la descripción de la Acción en un par de propiedades, y luego invoca() la Acción.Cuando la acción vuelve, la descripción y la hora se borran (su DateTime puede ser anulable, o establecerlo en DateTime.Max). Tenga en cuenta que, dado que todos los invocadores se agrupan de uno en uno en el hilo de la interfaz de usuario, aquí no se pierde nada al actualizar la cola.
Ahora, aquí es donde llegamos al punto de esto. Nuestra clase de invocación debe tener un latido System.Threading.Timer thread. ¡Este NO debería ser un objeto windows.forms.timer, ya que se ejecuta en el subproceso UI (y se bloquearía cuando el ui está bloqueado!).
El trabajo de este temporizador es mirar periódicamente en el momento en que se invoca la acción actual. Si DateTime.Now - BeginTime> X, el temporizador de latido decidirá que esta Acción ha bloqueado. El temporizador de latido registrará (independientemente de cómo se registre) la DESCRIPCIÓN registrada para esa Acción. Ahora tiene una grabación de lo que sucedía en el momento en que su UI se bloqueó y puede depurarlo mejor.
Sé que no es una respuesta a su problema, pero al menos al hacer esto usted puede hacerse una idea de lo que está sucediendo en el momento en que está bloqueado.
¿Quién se dirige cuando se congela? ¿Es un control o evento particular, o es aleatorio? – Will
Realmente no entiendo lo que quieres decir. – EricSchaefer
Sus eventos se organizan en el hilo de la interfaz de usuario de a uno por vez. Alguien está bloqueando durante este proceso. Me pregunto si es el mismo método que se organiza cada vez que se bloquea, y/o si se está actualizando el mismo control que bloques cada vez. – Will