Cómo utilizar la función Invocar
En la programación de subprocesos múltiples, a menudo tenemos que actualizar la visualización de la interfaz en el subproceso de trabajo, y es incorrecto llamar directamente al control de la interfaz en subprocesos múltiples, que están diseñados para resolver este problema. Aparece , lo que le permite actualizar de forma segura la visualización de la interfaz en varios subprocesos.
El enfoque correcto es encapsular el código involucrado en la actualización de la interfaz en el hilo de trabajo en un método y llamarlo a través de Invoke o BeginInvoke
. uno hace que el hilo de trabajo espere. El otro no lo hará.
Al crear una interfaz de programa GUI utilizando WinForm del marco Framework, si desea cambiar el estado del control en la función de respuesta a eventos del control
, por ejemplo: El texto de un botón originalmente se llamaba "Abrir", después de hacer clic, el texto del botón muestra "Cerrar", los principiantes a menudo lo dan por sentado y escriben así:
void ButtonOnClick(object sender, EventArgs e )
{
button.Text="Close";
}
Después de ejecutar el programa de esta manera, puede ocurrir una excepción. se activará. El mensaje de excepción es aproximadamente "El control no se puede crear desde una fuente diferente". Tenga en cuenta que esto es "posible" y no necesariamente desencadena esta excepción.
El motivo de esta excepción es que el control se crea en el hilo principal (como this.Controls.Add(...);). en el control El hilo en el que se encuentra
no es el hilo principal. Cambiar el estado del control en la función de respuesta a eventos del control puede provocar conflictos entre el hilo y el hilo principal. Si el hilo principal está redibujando la apariencia del control, cambiar la apariencia del control en otro hilo causará confusión en la pantalla. Sin embargo, esta situación no siempre sucede. Si el hilo principal está volviendo a dibujar otros controles en este momento, dicha escritura puede pasar normalmente sin desencadenar una excepción.
La forma correcta de escribirlo es llamar al método Invoke del control en la función de respuesta del control (de hecho, si ha usado C
Builder antes, también encontrará un método similar a Invoke que se activa en la función del hilo principal). El método Invoke buscará en el árbol de control hasta encontrar el subproceso que creó el control (generalmente el subproceso principal) y luego ingresará a ese subproceso para cambiar la apariencia del control y garantizar que no se produzcan conflictos de subprocesos.
La llamada "responder a las operaciones mientras se agregan nodos" solo puede ser relativa, por lo que la carga sobre el hilo de la interfaz de usuario no será demasiado grande, porque la actualización correcta de la interfaz siempre debe realizarse la interfaz de usuario
Para hacerlo con subprocesos, lo que tenemos que hacer es asumir la mayoría de los cálculos en el subproceso de trabajo y colocar las actualizaciones puras de la interfaz en el subproceso de la interfaz de usuario, para reducir la interfaz de usuario.
El propósito de la carga del hilo.
Proporcione un ejemplo simple para ilustrar cómo usarlo. Por ejemplo, está iniciando un hilo y desea actualizar un cuadro de texto en el formulario en el método del hilo.
usando System. .Threading;
//Iniciar un hilo
Thread thread=new Thread(new
ThreadStart(DoWork)); .Start( );
//Método de hilo
private void DoWork()
{
this.TextBox1.Text=" Soy un cuadro de texto";
}
Si opera como lo anterior, habrá excepciones en VS2005 o 2008...
La forma correcta es usar Invoke\BeginInvoke
usando System.Threading;
prueba de espacio de nombres
{
clase pública parcial Form1: Form p>
{
delegado público void MyInvoke(cadena str1, cadena str2);
formulario público1()
{
InitializeComponent( );
}
public void DoWork()
{
MyInvoke mi = new MyInvoke(UpdateForm);
this.BeginInvoke(mi, new Object[] {"Soy un cuadro de texto", "jaja"});
}
public void UpdateForm( string param1, string parm2)
{
this.textBox1.Text = param1 parm2;
}
botón de anulación privado1_Click(objeto remitente, EventArgs e )
{
Hilo de hilo = nuevo hilo(nuevo ThreadStart(DoWork));
thread.Start();
}
}
}
¡Presta atención al uso de agentes!
Etiqueta: Invocar