visual transición the studio realizar problem podido has detected contexto c# .net multithreading contextswitchdeadlock

c# - transición - .NET-Se detectó ContextSwitchDeadlock



managed debugging assistant contextswitchdeadlock has detected a problem c# (1)

Es solo una advertencia de un asistente de depuración administrado (MDA). Su código está violando un requisito bastante difícil para los hilos de un solo apartamento con rosca (STA), no se les permite bloquear por largos períodos. La advertencia es lo suficientemente real, bloquear el subproceso de la interfaz de usuario puede causar un interbloqueo fácilmente. Pero la explicación en su caso es simple, simplemente se vuelve catatónica porque está ocupada con la informática, no porque esté realmente bloqueada. La MDA no puede notar la diferencia.

Puede desactivar la advertencia con Debug + Exceptions, abrir el nodo de Asistentes de depuración administrados y deseleccionar ContextSwitchDeadlock.

Eso aún deja al usuario con una ventana en su escritorio que está muerta para el mundo, no es precisamente una gran experiencia para el usuario. Y puede tener efectos secundarios, haciendo que otros programas dejen de responder cuando envían mensajes a ventanas de nivel superior.

Necesitas usar hilos para resolver realmente este problema. Eche un vistazo a BackgroundWorker, está bien documentado en MSDN Library y en muchos otros lugares.

Tengo una clase en c # (.net 3.5 cp, vs2010) que ejecuta complejos complejos que usualmente toman mucho tiempo. Después de un minuto se produce una excepción, que se detectó ContextSwitchDeadlock. La excepción está localizada, a mi idioma no inglés, por lo que no puedo copiar y pegar, pero el significado es el siguiente: ¨ El módulo CLR no pudo hacer la transición del contexto COM ... al contexto COM ... durante 60 segundos. Los subprocesos que poseen el contexto / apartamento objetivo probablemente están haciendo una espera de no bombeo o procesando una operación muy larga sin bombear los mensajes del sistema de Windows.

Básicamente, parece que mi aplicación está computando y no responde a las ventanas durante mucho tiempo y Visual Studio la apaga e informa de un interbloqueo probable.

Estaba intentando investigar y encontré dos soluciones:

  1. Deshabilite alguna opción en Visual Studio Debbuger para detectar puntos muertos. No funciona para mí porque funciona solo con fines de depuración.

  2. Llame a algún método de DoEvents, pero fue para formularios de Windows y no para WPF y estoy usando WPF.

También se sugirió crear subprocesos separados, pero soy completamente nuevo en subprocesos y no sé qué debo hacer. ¿Alguna sugerencia por favor?