Uso de Invoke en C # --------- Operación de subprocesos múltiples: la operación entre subprocesos no es válida y el subproceso que nunca creó el control nunca accede a ella

Diseñe una interfaz, cambie el valor de la etiqueta después de hacer clic en el botón
Realización: haga clic en el botón para ejecutar el evento de clic del botón, cree un cambio de subproceso bajo la función y luego ejecute el método de cambiar la etiqueta en este subproceso ChangeLabel ();
Inserte la descripción de la imagen aquí
Descripción: el control está en la interfaz de usuario Creado en el hilo principal, al ingresar a la función de respuesta de evento del control, está en el hilo del control, no en el hilo principal. Cambiar el estado del control en la función de respuesta a eventos del control puede causar un conflicto de subprocesos con el subproceso principal.
Si usa directamente la siguiente redacción, inevitablemente cometerá errores:

 private void btnChange_Click(object sender, EventArgs e)
 {
     Thread Change = new Thread(new ThreadStart(ChangeLabel));
     Change.Name = "zyh";
     Change.Start();
 }
 private void ChangeLabel()
 {
     try
     {
         label.Text = "改变值";
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message,"错误提示",MessageBoxButtons.YesNo,MessageBoxIcon.Error);
     }
 }

Inserte la descripción de la imagen aquí

Solución:

La forma correcta es llamar al método Invoke del control en la función de respuesta de control. El método Invoke buscará el control hasta que encuentre el hilo que creó el control (generalmente el hilo principal), y luego ingresará ese hilo para cambiar la apariencia del control y asegurarse de que no ocurran conflictos de hilos. Hay tres ejemplos de escritura correcta:

El primero:

this.Invoke (nueva acción (() =>
{label.Text = "关闭";}
));

El segundo tipo:

this.Invoke (nueva acción (
delegado {label.Text = "关闭";}
));

El tercer tipo:

Cuando la propiedad InvokeRequired de un control es cierto, esto indica que hay un hilo que no sea crear quiere acceder a él
MSDN dice:
Obtiene un valor que indica la persona que llama en el momento de la llamada si el método de control debe llamar al método Invoke, porque la llamada El lado está en un subproceso distinto del subproceso donde se crea el control. Si el identificador del control se crea en un subproceso diferente del subproceso de llamada (lo que indica que debe llamar al control a través del método Invoke), entonces verdadero; de lo contrario, falso. Los controles en Windows Forms están vinculados a subprocesos específicos y no tienen seguridad de subprocesos. Por lo tanto, si llama al método de control desde otro subproceso, debe usar un método de invocación del control para ordenar la llamada al subproceso apropiado. Esta propiedad se puede usar para determinar si se debe llamar al método Invoke, lo cual es útil cuando no se sabe qué subproceso posee el control.

private void ChangeLabel()
{
try
{
    if (label.InvokeRequired)
    {
        label.Invoke(new MethodInvoker(ChangeLabel));
    }
    else
    {
        label.Text = "改变值";
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message,"错误提示",MessageBoxButtons.YesNo,MessageBoxIcon.Error);
}
}

Ejecución del programa:
haga clic en el botón, el sistema determina que un subproceso que no sea el subproceso de la etiqueta desea acceder a él. En este momento, el atributo InvokeRequired es verdadero, llame al método Invoke, ejecute el método ChangeLabel (), salte al resto y ejecute el cambio de la etiqueta En este momento, tuvo éxito. En
Inserte la descripción de la imagen aquí
pocas palabras, si hay dos hilos, el Hilo A y el Hilo B, y hay un Control c, que es nuevo en el Hilo A. Entonces, cualquier método llamado c.InvokeRequired que se ejecute en el subproceso A devolverá falso.
Por el contrario, si algún método que se ejecuta en Thread B llama a c. InvokeRequired, devolverá verdadero.
Si es un subproceso de interfaz de usuario no tiene nada que ver con el resultado. (Por lo general, el hilo donde se encuentra el Control es un hilo de la interfaz de usuario, pero puede haber excepciones)
Inserte la descripción de la imagen aquí
Consulte la publicación del blog:
https://www.cnblogs.com/vaevvaev/p/6909042.html

Publicado 18 artículos originales · elogiado 0 · visitas 233

Supongo que te gusta

Origin blog.csdn.net/qq_39217004/article/details/105496169
Recomendado
Clasificación