¿Cómo ejecuto un simple fragmento de código en un hilo nuevo?

Resuelto asked hace 15 años • 0 respuestas

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?

 avatar Dec 12 '08 23:12
Aceptado

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();
Ed Power avatar Nov 28 '2012 17:11 Ed Power

BackgroundWorkerParece 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 ProgressChangedde los RunWorkerCompletedcontroladores. Sin embargo, actualizar la GUI DoWork provocará InvalidOperationException.
Gant avatar Jan 27 '2009 02:01 Gant