Estoy ejecutando una aplicación C # y durante el tiempo de ejecución obtengo el siguiente error:
El CLR no ha podido realizar la transición del contexto COM 0x20e480 al contexto COM 0x20e5f0 durante 60 segundos. Es muy probable que el hilo que posee el contexto / apartamento de destino esté haciendo una espera sin bombeo o procesando una operación de ejecución muy larga sin bombear mensajes de Windows. Esta situación generalmente tiene un impacto negativo en el rendimiento e incluso puede hacer que la aplicación deje de responder o que el uso de la memoria se acumule continuamente con el tiempo. Para evitar este problema, todos los subprocesos de apartamento de un solo subproceso (STA) deben usar primitivas de espera de bombeo (como CoWaitForMultipleHandles) y mensajes de bombeo de forma rutinaria durante las operaciones de ejecución prolongada.
¿Alguien puede ayudarme con el problema aquí?
Muchas gracias.
fuente
Para encontrar qué operación bloquea el cambio de contexto y hace que se muestre el MDA contextSwitchDeadlock , puede utilizar los siguientes pasos. Tenga en cuenta que me referiré a Visual Studio 2012.
Suponiendo que decida no mover la operación que consume muchos recursos de su hilo principal, eche un vistazo a algunas de las otras respuestas y comentarios aquí antes de hacerlo, tiene las siguientes opciones para deshabilitar los asistentes de depuración administrados.
Dentro del depurador de Visual Studio
Fuera del depurador de Visual Studio
Nota: Una de las dos primeras opciones debe establecerse en 1 para que la tercera tenga algún efecto.
En mi caso, el problema fue una llamada a ObjectContext.SaveChanges () en Entity Framework dentro de una aplicación de consola. Con el MTAThreadAttribute aplicado al
Main()
método, la excepción ContextSwitchDeadlock ya no se generó . Lamentablemente, no estoy seguro de todos los efectos de este cambio.fuente
Este mensaje indica que algún código suyo está intentando cambiar de hilo y el hilo de destino está ocupado. Por ejemplo, un subproceso en segundo plano que intenta enviar una llamada al subproceso de la interfaz de usuario para actualizar la interfaz de usuario, mientras que la interfaz de usuario está ejecutando un ciclo cerrado durante un tiempo.
Para averiguar realmente qué está sucediendo, debe ingresar al depurador y observar todos los subprocesos y lo que están haciendo.
fuente
En algunos casos:
Debug -> Exceptions -> Managed Debug Assistants
y desmarcando el elemento ContextSwitchDeadlock.
fuente
Simplemente seleccione Excepciones del menú Depurar en la ventana de Visual Studio 2005, aparecerá el cuadro de diálogo Edxception, seleccione el Nodo de excepción de los asistentes de depuración administrados, luego seleccione ContextSwitchDeadlock y elimine la selección de la columna Lanzado. esto evitará que vs lance la excepción ContextSwitchDeadlock.
Espero que esto ayude..
fuente
Me encontré con este problema cuando estaba tratando de averiguar por qué
OracleDataReader
estaba lanzando una excepción. Pensé que era porque se estaba asignandonull
porque la excepción estaba relacionada con un parámetro que era `nulo. Así que lo hice:while (dr.Read()) { while (dr != null) // <-- added this line { ...
Resultó que
dr
NUNCA era nulo, por lo que el ciclo siguió y siguió hasta que llegó este mensaje, y siguió y siguió un poco más porque puede hacer clic en "Continuar" para que continúe hasta que se quede sin memoria (no haga esto - haga clic en "Aceptar" en su lugar). La moraleja de la historia es buscar fugas de memoria que estén transmitiendo datos desde la base de datos a la memoria en bucles hasta el infinito. En realidad, el error trata de advertirle de un mal escenario. Mejor prestarle atención.fuente
Este error me apareció en numerosas ocasiones y lo rastreé hasta una iteración en
DataGridViewRow
, en la que establecí el valor de la casilla de verificación en verdadero. Como estaba ejecutando en modo de depuración, tenía la opción de continuar, así que pude hacer exactamente esto.Espero que esto ayude a alguien.
fuente
Suponiendo que está usando Visual Studio, puede hacer clic
Ctrl+Alt+E
en el proyecto actual y se mostrará la ventana de excepciones con los asistentes de depuración administrados seleccionados, debe desmarcar la opción "ContextSwitchDeadlock". luego construya un proyecto actual.fuente