Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 22231|Respuesta: 0

[Comunicación] .net/c# Sincronización Contexto para detalles

[Copiar enlace]
Publicado en 15/3/2018 11:51:07 | | | |
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:







Anterior:Cuarenta y siete formas de optimizar un programa en C#
Próximo:.net/c# Shanghai Pai Asistente de marca de Shanghái [con código fuente]
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com