2010-01-12 18 views
6

Tengo una aplicación GUI que se conecta a un sensor, reúne datos y los procesa en segundo plano usando BackgroundWorker hilos.Cómo depurar y resolver un bloqueo de 'DisconnectedContext'?

Tal como está, estoy publicando datos en la GUI usando el ProgressChanged que parecía estar funcionando bien para empezar. Desde entonces, he aumentado las tasas de datos y he descubierto un problema; si el software se deja funcionar durante unos minutos, la cantidad de uso del procesador parece aumentar hasta alcanzar casi el 100% en ambos núcleos en mi máquina y en ese momento, aparece un error que dice:

El Asistente de depuración administrado 'DisconnectedContext' detectó un problema en 'myapp.exe'. Información adicional: el contexto 0xe2ba0 está desconectado. Liberando las interfaces del contexto actual (contexto 0xe2d10). Esto puede causar corrupción o pérdida de datos.

He leído algunas cosas en la web que sugieren que esto puede suceder si una aplicación GUI no puede bombear mensajes lo suficientemente rápido. Me he dado cuenta de que puedo provocar que el mismo choque ocurra más rápido si cambio el tamaño de la ventana rápidamente (es decir, bombeo una carga de más mensajes) lo cual respalda la teoría que creo.

Así que las preguntas aquí son:

  1. si alguien está de acuerdo con mi hipótesis sobre el mensaje de bombeo?
  2. Si hay otra explicación?
  3. ¿Hay alguna manera de que pueda probarlo (vea el número de mensajes en la cola quizás)?
  4. ¿Estos son todos malos olores de código que sugieren que estoy haciendo esto de la manera incorrecta?

Cualquier consejo sería muy bien recibido.

Respuesta

3

Suena como un problema muy específico y creo que es por eso que nadie ha respondido todavía, pero creo que puedo ayudar en la pregunta n. ° 3.

Spy++ debería poder ver los mensajes que van a su ventana. Creo que podría usarlo para ver los mensajes bombear a su GUI y hacer su prueba de cambio de tamaño. Si observa un gran aumento de mensajes que intentan procesarse, puede confirmar su hipótesis.

Como nota aparte, he leído que es posible que pueda cambiar el apartamento de la hebra principal de STAThread a MTAThread para que este MDA desaparezca.

Perphaps puede modificar su aplicación para escupir las lecturas del sensor a un archivo o ponerlas en cola en un mecanismo diferente en lugar de actualizar la interfaz gráfica de usuario constantemente. HTH.

+1

Probé la configuración MTATHread que solo parecía agregar un bloqueo ocasional. En su lugar, adopté un mecanismo queue y formé un error en una parte del código de la pantalla que estaba sobre-rellenando un 'RichTextBoxControl'. Entre esos dos, parece que he resuelto el problema. Gracias por las sugerencias. –

+0

He visto esto suceder unas cuantas veces más y definitivamente se desencadena al intentar enviar demasiadas solicitudes 'ProgressChanged' desde el hilo del productor de datos a sus oyentes. –

Cuestiones relacionadas