Tenemos una aplicación de escritorio que realiza un conjunto bastante riguroso de cálculos en un hilo de fondo. Partes de este cálculo se realizan en una biblioteca no administrada a la que accedemos a través de interoperabilidad. Lo que estamos descubriendo es que, cuando iniciamos el cálculo, el subproceso de interfaz de usuario deja de responder durante el cálculo. Teníamos la impresión de que el marco manejaría el cambio de hilo para permitir que la IU siga siendo receptiva, pero ese no es el caso. Hemos encontrado que podemos insertar un Thread.Sleep (0) o Application.DoEvents() para permitir que la UI responda. Esto tiene el efecto secundario de ralentizar el cálculo. Además, porciones del cálculo realizado por el código no administrado pueden tardar hasta 30 segundos en completarse, y durante este tiempo la aplicación siempre deja de responder. El cálculo completo puede tardar de dos a cinco minutos en completarse..NET Threading Model and Application.DoEvents vs. Thread.Sleep
Esto conduce a las siguientes preguntas:
- ¿Cuál es el modelo de hilos marco .NET con respecto a la interfaz de usuario y la interoperabilidad?
- ¿Somos incorrectos al suponer que el marco debe manejar el cambio de subprocesos entre el fondo y los subprocesos de la interfaz de usuario?
- ¿Cuál es la diferencia entre usar Thread.Sleep y Application.DoEvents en esta situación, y se prefiere uno sobre el otro?
NOTA: muy viejo Q & A; busca discusiones más recientes para obtener buenas respuestas sobre las soluciones disponibles en la actualidad. – ToolmakerSteve