He leído muchos artículos introductorios sobre cómo actualizar la interfaz principal en el hilo de segundo plano, y la mayoría utiliza Control.Invoke y Control.BeginInvoke. Estas son buenas soluciones, pero hay dos problemas:
1. Debes consultar System.Windows.Forms y luego usar System.Windows.Forms
2. La estructura del código es relativamente desordenada. (En realidad, esto también es causado por #1)
Microsoft ofrece otra solución más elegante, que es System.Threading. SynchronizationContext。 Como puedes ver, no está en namesapce System.Windows.Forms, así que podemos usarlo legítimamente en BusinessLaryer, Control e incluso en módulos.
Y es muy cómodo de usar, solo necesitas centrarte en los siguientes dos métodos:
1. Enviar: Envía una solicitud de actualización de interfaz al hilo principal, bloqueando el hilo actual hasta que regrese.
2. Publicación: Envía una solicitud de actualización de interfaz al hilo principal sin bloquear el hilo actual.
De hecho, todos son el mismo método, salvo que send es síncrono y post es asincrónico
Antes de Form1 form = new Form1(), el objeto SynchronizationContext estaba vacío, y cuando se instanciaba el formulario Form1, se añadía el objeto SynchronizationContext a este hilo. Así que la respuesta es que cuando se crea el objeto Control, el objeto SynchronizationContext también se crea y se adjunta al hilo. Todo al usar la forma InitializeComponent(); Una vez hecho esto, puede obtener un objeto que no sea NULL
Finalmente, la diferencia entre los métodos Sendt() y Post() de SynchronizationContext:
Send() se implementa simplemente llamando al delegado en el hilo actual (llamada síncrona). Es decir, el hilo UI se llama directamente al subhilo para ejecutarse, y el subhilo continuará ejecutándose una vez completada la ejecución del hilo UI.
Post() se implementa llamando a un delegado en el pool de hilos (llamada asíncrona). Esto se debe a que el subhilo encontrará un hilo del pool de hilos para ajustar el hilo de la interfaz, y el subhilo ejecutará directamente su propio código sin esperar a que el hilo de la interfaz se complete. Código de prueba:
Resultado:
Hilo principal de la interfaz: 1 Hilo: 5 SynchContext:1
Resumen:El objeto SynchronizationContext en el hilo UI, ya sea llamado en el hilo principal o dentro del hilo, se ejecutará en el hilo principal, así que cuando hay mucho código que consume mucho tiempo, hará que la interfaz se congele o finja la muerte!
En realidadEl hilo de la interfaz no utiliza la clase SynchronizationContext, sino WindowsFormsSynchronizationContextEste Dongdong.
Código fuente System.Threading.SynchronizationContext:
Código fuente WindowsFormsSynchronizationContext:
|