Pregunta El CLR no ha podido realizar la transición del contexto COM [...] durante 60 segundos.


Estoy obteniendo este error en el código que solía funcionar. No he cambiado el código.

Aquí está el error completo:

El CLR no ha podido pasar del contexto COM 0x3322d98 al contexto COM 0x3322f08 durante 60 segundos. El hilo que posee el contexto / apartamento de destino probablemente esté haciendo una espera de no bombeo o procesando una operación de muy larga ejecución sin bombear mensajes de Windows. Esta situación generalmente tiene un impacto negativo en el rendimiento e incluso puede llevar a que la aplicación no responda o el uso de la memoria se acumule continuamente a lo largo del tiempo. Para evitar este problema, todos los subprocesos de apartamento de rosca única (STA) deben usar primitivas de espera de bombeo (como CoWaitForMultipleHandles) y rutinariamente bombear mensajes durante operaciones de larga ejecución.

Y aquí está el código que lo causó:

var openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
openFileDialog1.DefaultExt = "mdb";
openFileDialog1.Filter = "Management Database (manage.mdb)|manage.mdb";

//Stalls indefinitely on the following line, then gives the CLR error
//one minute later.  The dialog never opens.
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    ....
}

Sí, estoy seguro de que el cuadro de diálogo no está abierto en segundo plano, y no, no tengo ningún código COM explícito o clasificación no administrada o multihilo.

No tengo idea de por qué OpenFileDialog no se abrirá, ¿alguna idea?


32
2018-04-30 21:52


origen


Respuestas:


Lo descubrí: lo lleva automáticamente a la última ubicación que buscó cada vez que se abre el cuadro de diálogo. Si esa ubicación es una ubicación de red que ya no existe (por ejemplo, la otra computadora está apagada), se colgará para siempre.

Mi solución se ve así:

string initialDirectory = ...; //Figure out an initial directory from somewhere
openFileDialog1.InitialDirectory = !Directory.Exists(initialDirectory)
                                       ? Path.GetPathRoot(Environment.SystemDirectory)
                                       : initialDirectory;

11
2018-05-14 15:07



Por lo tanto, se está quejando de un contexto COM a pesar de que no está utilizando explícitamente COM porque abre un cuadro de diálogo de shell nativo debajo de ese precioso código c # y el shell usa COM.

Lo que este mensaje te está diciendo es que sea lo que sea lo que intenta hacer, lo está haciendo en el hilo de la interfaz de usuario y no de una manera agradable, y parece que lleva mucho tiempo. Obviamente, lo que está mal no es tu culpa per se, así que puedes ignorar la mayoría de los consejos que te da.

Cosas para intentar:

  1. Primero probaría, como AaronLS sugerir, simplificando openFileDialog cuanto más se pueda. Intenta no configurar nada; solo crea un chico nuevo y llama ShowDialog(). Si eso resuelve el problema, entonces le acabas de dar los parámetros mal formados, y podemos hablar sobre las implicaciones de eso. Sin embargo, si no funciona, eso significa que algo va mal en tierra de concha.

  2. Una posible razón por la que esto podría suceder es porque tiene una extensión de shell instalada que está haciendo algo malo. Lo mejor que puedes hacer es break-in (ctrl+break in Visual Studio Creo, o debug->break all en la barra de menú) y obtener la pila completa para nosotros. Deberíamos poder identificar al culpable al ver quién está en la pila cuando aparece el diálogo.


9
2018-04-30 22:20



Una solución para el problema es ir al menú Depurar -> Excepciones -> Administradores de depuración en Visual Studio y desmarcar ContextSwitchDeadlock

De http://blog.wpfwonderland.com/2007/08/16/clr-has-been-unable-to-transition-from-com-context-for-60-seconds/

Actualizar: Por favor, no menosprecie, si lo cree, esa solución es una idea horrible. Varias personas probaron una serie de soluciones enumeradas como respuestas aquí, pero mi solución fue lo único que las ayudó. Es por eso que la respuesta todavía tiene el puntaje positivo.


6
2017-11-27 14:36



Obtuve este problema mientras trabajaba con una gran base de datos e hizo que la IU se congelara durante un largo período. Así que puse los códigos en una BackgroundWorker y ahora el problema se ha ido. gracias a @i_am_jorf

Lo que este mensaje te está diciendo es que sea lo que sea que esté tratando de hacer,   lo está haciendo en el hilo de la interfaz de usuario y no de una manera agradable, y eso parece   tomará mucho tiempo.

private void btnConvert_Click(object sender, EventArgs e)
{
  Cursor = Cursors.WaitCursor;
  bgwConvert.RunWorkerAsync();
}

private void bgwConvert_DoWork(object sender, DoWorkEventArgs e)
{
  //My taking-lots-of-time codes
}

private void bgwConvert_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  Cursor = Cursors.Default;
  MessageBox.Show("Done");
}

5
2017-10-18 09:24



También tuve este problema, y ​​lo resolví cambiando mi .Net framework por el último (.Net framework 4.5 en mi caso, desde las propiedades del proyecto). Ventana-> Depurar-> .Net Framework) y cambiar el tipo de CPU de x86 a Cualquier CPU (en propiedades del proyecto Ventana-> Construir-> Objetivo de plataforma)


2
2017-11-30 14:51



Acabo de tener los mismos problemas momentos antes, la solución en mi caso era simple: ¡Limpia la solución y reconstruyela!

Estoy usando Visual Studio 2015.

Espero que esto ayude.


0
2018-03-23 17:54