.NET 4.0 y el temido OnUserPreferenceChanged Hang

He estado plagado con el temido OnUserPreferenceChanged Hang al que Ivan Krivyakov se refiere bastante bien:

http://ikriv.com/en/prog/info/dotnet/MysteriousHang.html#BeginInvokeDance

Publiqué una pregunta hace un tiempo, cuando originalmente me encontré con el problema:

Sin embargo, otra C # Deadlock Debugging Question

Pensé que lo había resuelto quitando un Control que se construyó a partir del hilo de UI, pero después de un rato reapareció (probablemente nunca se fue …).

Hemos estado usando .NET 3.5, que entiendo utiliza CLR 2.0. Recientemente, la aplicación se ha actualizado para usar .NET 4.0 Client Profile / CLR 4.0. Además, hemos actualizado de Infragistics WinForms 10.1 a 10.3. La única otra diferencia es que la versión anterior está ofuscada … ¿Alguien ha tenido problemas con la ofuscación y el ahorcamiento?

He tenido otra puñalada para deshacerme de cualquier aplicación que se cuelgue de una vez por todas, pero de forma inusual, no he podido reproducir el hang en la versión más reciente (usando .NET 4.0). El hang es simple de reproducir en la versión anterior (usando .NET 3.5), utilizando la práctica aplicación Freezer de Ivan Krivyakov (ver su artículo), que dispara un mensaje WM_SETTINGCHANGE a petición.

Puede que tenga un poco de esperanza de que el problema haya desaparecido por voluntad propia, pero ¿alguien sabe si ha habido algún cambio en el CLR de 2.0 a 4.0 que podría causar esto?

————————————————– —SOLUCIÓN———————————————- —-

Por lo tanto, después de probar variaciones de la aplicación, por ejemplo, CLR 2.0 + Infragistics 2010.1, CLR 2.0 + Infragistics 2010.3 y CLR 4.0 + Infragistics 2010.1, creemos que identificamos el problema como un problema con un componente de Infragistics en WinForms 2010.1 (sin correcciones ) Todavía tenemos que reproducir la congelación utilizando CLR 2.0 o CLR 4.0 con Infragistics 2010.3, en su lugar (y hemos conseguido bastante buenos reproductores ahora …).

La mejor guía que he encontrado para resolver este problema es aquí:

  • Depuración de la aplicación Windows Forms se bloquea durante SystemEvents.UserPreferenceChanged – El blog del equipo DSUI – Site Home – MSDN Blogs

Lo guiará a través de WinDbg para verificar la causa del error y le mostrará cómo encontrar lo que lo está causando. Como mencionaste, lo más probable es que se deba a que se haya creado un control en un hilo que no sea de la interfaz de usuario.

En mi caso, resolví el problema creando una fábrica que usa el SynchronizationContext del subproceso UI para crear el control y luego invoco CreateControl () para forzar la creación de un identificador UI.

El artículo de Soporte de Microsoft está aquí:

  • La aplicación Windows Forms se congela cuando se cambian las configuraciones del sistema o la estación de trabajo está bloqueada

Si ejecuta la aplicación de muestra desde su página web con el primer CLR 2.0 y luego con CLR 4.0, verá que el problema parece haber desaparecido en 4.0. No tiene idea de qué se ha cambiado, pero tal vez realmente resolvió el problema. BR