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.
- Reproduzca el error. Esto podría implicar un poco de prueba y error.
- Haga clic en 'Aceptar' en lugar de 'Continuar' en el asistente de depuración administrada que se muestra.
- Asegúrese de que la barra de herramientas Ubicación de depuración esté activa haciendo clic con el botón derecho en la zona de acoplamiento de la barra de herramientas y seleccionando 'Ubicación de depuración'. Debería ver una lista desplegable con la etiqueta 'Subproceso' en la barra de herramientas si está activa.
- El elemento seleccionado en la lista desplegable del hilo debe ser un hilo diferente al hilo principal ya que será un hilo de fondo que se queja de que el hilo principal está acaparando toda la atención. Seleccione el hilo principal en la lista desplegable.
- Ahora debería ver el código que bloquea el cambio de contexto en el editor de código.
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
- Puede deshabilitar un MDA directamente en el cuadro de diálogo MDA que se muestra cuando se produce el error al desmarcar 'Interrumpir cuando se lanza este tipo de excepción'.
- Con el cuadro de diálogo Configuración de excepción siguiendo las instrucciones de MSDN a continuación .
... en el menú Depurar, haga clic en Excepciones. (Si el menú Depurar no contiene un comando Excepciones, haga clic en Personalizar en el menú Herramientas para agregarlo). En el cuadro de diálogo Excepciones, expanda la lista Asistentes de depuración administrados y, a continuación, desactive la casilla de verificación Lanzada para el MDA individual.
Fuera del depurador de Visual Studio
- Clave de registro (en todo el equipo, todos los MDA afectados)
- Variable de entorno (en toda la máquina, se pueden especificar MDA)
- Parámetros de configuración de la aplicación (ámbito de la aplicación, se pueden especificar MDA)
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.