¿Cómo ejecuto un simple fragmento de código en un hilo nuevo?
Tengo un poco de código que necesito ejecutar en un hilo diferente al de la GUI, ya que actualmente hace que el formulario se congele mientras se ejecuta el código (aproximadamente 10 segundos).
Supongamos que nunca antes he creado un hilo nuevo; ¿Cuál es un ejemplo simple/básico de cómo hacer esto en C# y usando .NET Framework 2.0 o posterior?
Un buen lugar para empezar a leer es Joe Albahari .
Si quieres crear tu propio hilo, esto es tan simple como parece:
using System.Threading;
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
/* run your code here */
Console.WriteLine("Hello, world");
}).Start();
BackgroundWorker
Parece ser la mejor opción para ti.
Aquí está mi ejemplo mínimo. Después de hacer clic en el botón, el trabajador en segundo plano comenzará a trabajar en el hilo en segundo plano y también informará su progreso simultáneamente. También informará una vez finalizado el trabajo.
using System.ComponentModel;
...
private void button1_Click(object sender, EventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
// this allows our worker to report progress during work
bw.WorkerReportsProgress = true;
// what to do in the background thread
bw.DoWork += new DoWorkEventHandler(
delegate(object o, DoWorkEventArgs args)
{
BackgroundWorker b = o as BackgroundWorker;
// do some simple processing for 10 seconds
for (int i = 1; i <= 10; i++)
{
// report the progress in percent
b.ReportProgress(i * 10);
Thread.Sleep(1000);
}
});
// what to do when progress changed (update the progress bar for example)
bw.ProgressChanged += new ProgressChangedEventHandler(
delegate(object o, ProgressChangedEventArgs args)
{
label1.Text = string.Format("{0}% Completed", args.ProgressPercentage);
});
// what to do when worker completes its task (notify the user)
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
delegate(object o, RunWorkerCompletedEventArgs args)
{
label1.Text = "Finished!";
});
bw.RunWorkerAsync();
}
Nota:
- Puse todo en un solo método usando el método anónimo de C# para simplificar, pero siempre puedes utilizar diferentes métodos.
- Es seguro actualizar la GUI dentro
ProgressChanged
de losRunWorkerCompleted
controladores. Sin embargo, actualizar la GUIDoWork
provocaráInvalidOperationException
.