Red de conocimiento informático - Material del sitio web - Cómo utilizar backgroundworker para lograr el efecto de espera de inicio de sesión

Cómo utilizar backgroundworker para lograr el efecto de espera de inicio de sesión

/*En nuestros programas, a menudo hay algunas operaciones a largo plazo. Para garantizar la experiencia del usuario y no hacer que la interfaz deje de responder, generalmente utilizamos subprocesos múltiples

Operación, deje que la operación que requiere mucho tiempo se complete en segundo plano y luego procese o dé indicaciones una vez completada. Durante la operación, la barra de progreso y otros elementos de visualización en la nueva interfaz también se actualizarán de vez en cuando. también Para controlar el hilo en segundo plano para interrumpir la operación actual.

En el pasado, aplicaciones similares eran más problemáticas, requerían escribir más código y podían ocurrir excepciones fácilmente. En .net, se proporciona un componente

en segundo plano para resolver específicamente este problema.

Usar este componente es realmente muy simple. Por ejemplo, hagamos un pequeño ejemplo de una barra de progreso similar a la siguiente interfaz, realicemos

operaciones que requieren mucho tiempo en el hilo de fondo. Y actualice la interfaz al mismo tiempo. La barra de desplazamiento y la información solicitada aparecerán después de que se complete la operación.

Arrastre el componente backgroundWorker en la interfaz y responda a sus tres eventos.

El código es el siguiente:*/

usando System;

usando System.Collections.Generic;

usando System.ComponentModel ;

p>

usando System.Data;

usando System.Drawing;

usando System.Linq;

usando System.Text;

usando System.Windows.Forms;

pequeño ejemplo de subprocesos múltiples de espacio de nombres

{

clase parcial pública Form1 : Formulario

{

formulario1 público()

{

InitializeComponent();

}

//Aquí está Procesar la visualización de la interfaz respondiendo a mensajes

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

this.progressBar1.Value = e. ProgressPercentage;

this.label1.Text = e.UserState.ToString();

this.label1.Update();

}

//Este es el procesamiento del mensaje una vez completado el trabajo en segundo plano, y el procesamiento posterior se puede realizar aquí.

fondo vacío privadoWorker1_RunWorkerCompleted(remitente del objeto, RunWorkerCompletedEventArgs e)

{

MessageBox.Show("La operación finalmente se completó");

}

//Aquí es donde se llama a la función de trabajo cuando el proceso en segundo plano comienza a funcionar. Puede escribir sus funciones de controlador existentes aquí.

fondo vacío privadoWorker1_DoWork(remitente del objeto, DoWorkEventArgs e)

{

trabajo(this.backgroundWorker1

}

//Trabajo de procesamiento real

trabajo bool privado (BackgroundWorker bk)

{

int tatle =10000;

for (int i = 0; i lt; tatle; i )

{

if (bk.CancellationPending) //Aquí, determine si el usuario solicita cancelar el proceso en segundo plano, y puedo salir temprano.

{

bk.ReportProgress(i, String.Format("El valor actual es {0}, la operación fue interrumpida por solicitud del usuario", i)); >

return false;

}

// Durante el procesamiento, use esta función para informar el progreso del procesamiento al hilo principal. Es mejor convertirlo en un porcentaje. y compárelo con la barra de progreso exterior. El valor máximo debe corresponder. Aquí, no convertí, pero ajusté el valor máximo de la barra de progreso del hilo de la interfaz para que sea consistente con el número total aquí.

bk.ReportProgress(i, String.Format("El valor actual es {0} ", i));

}

devuelve verdadero;

p>

}

botón de anulación privada2_Click(remitente del objeto, EventArgs e)

{

//Cuando el usuario lo solicita para cancelar, manéjelo así. A veces no funciona muy bien.

this.backgroundWorker1.CancelAsync();

}

botón vacío privado1_Click(remitente del objeto, EventArgs e)

{

p>

//Esta oración es para comenzar el trabajo en segundo plano.

this.backgroundWorker1.RunWorkerAsync();

}

botón de anulación privada3_Click(remitente del objeto, EventArgs e)

{

p>

this.Close();

}

}

}

//General funciona, eso es todo. Después de procesarlo con la rutina, básicamente funcionará. Si varios subprocesos aún necesitan interactuar, o hay problemas como *compartir datos

//, System.Threading todavía se proporciona en. .net C# La clase .Thread no es muy diferente del uso tradicional y es bastante fácil de usar.