Actualmente estoy trabajando en un proyecto en C#. Tengo un método llamado updateProgress (), el cual tiene dos parámetros int (recuento y totalRows).

Si he de llamar al método diciendo updateProgress(conde, totalRows) esto funciona bien, pero quiero ejecutar este método dentro de un nuevo hilo.

¿Cómo puedo hacer esto, he mirado en línea y todo se ve demasiado complicado para lo que estoy deseando hacer.

Gracias por su ayuda con este

No actualización de la interfaz de usuario de un subproceso de trabajo.

OriginalEl autor Boardy | 2010-11-14

6 Comentarios

  1. 27

    Algo como esto:

    new Thread(delegate () {
        updateProgress(count, totalRows);
    }).Start();
    Gracias a todos por su ayuda
    Trató de Thread t = new Thread(new ParameterizedThreadStart(method)); t.Start(parameter); pero que no funcionó. El fragmento aquí lo hizo. Gracias
    ¿method Tener la firma void method(object), o es el parámetro de algún otro tipo?

    OriginalEl autor cdhowie

  2. 7

    Ser conscientes de que threading es un tema complejo, así que si usted tiene problemas de comprensión de la Api asincrónicas disponible en el .NET Framework, dudo de si se debe iniciar el uso de hilos en el primer lugar.

    De todos modos, usted tiene varias opciones:

    • Spin off de un hilo por su cuenta (como cdhowie señalado), la cual es bastante desanimado.

    • Utilizar el TPL (task parallel library) si está ejecutando .NET 4. Aquí es una buena introducción.
      TaskFactory.StartNew(() => updateProgress(count, totalRows));

    • Utilizar el ThreadPool si está ejecutando una versión anterior de .NET.
      ThreadPool.QueueUserWorkItem(s => updateProgress(count, totalRows));

    Por supuesto, hay otras maneras también, pero esto se imo de los más importantes.

    Saludos,

    Oliver Hanappi

    OriginalEl autor Oliver Hanappi

  3. 2

    Esto ha sido casi un año, y mi respuesta no va a añadir nada «nuevo» a lo que ya se ha dicho en otras respuestas.

    Si alguien está utilizando .Net 4.0 o superior, la mejor opción sería el uso de una tarea y dejar que el marco de decidir la mejor, llamando TaskFactory.StartNew(...). Para versiones anteriores, todavía es mejor utilizar el hilo de la piscina mediante el uso de ThreadPool.QueueUserWorkItem(...).

    Ahora, si alguien quiere usar el hilo en el modo básico (crear nuevo hilo) por alguna razón, entonces este

    new Thread(delegate () {
        updateProgress(count, totalRows);
    }).Start();

    puede ser escrito en un poco más limpia, mediante el uso de la expresión lambda, como este

    new Thread(() => updateProgress(count, totalRows)).Start();

    OriginalEl autor Arghya C

  4. 1

    Hay diferentes maneras de ejecutar un método en un subproceso diferente, como Thread, BackgroundWorker, ThreadPool o Task. Cuál elegir depende de varias cosas.

    Del nombre del método, parece que el método debe mostrar algunos avances en la interfaz de usuario de la aplicación. Si ese es el caso, usted tiene que ejecutar el método en la interfaz gráfica de usuario hilo. Si desea llamar desde otro hilo, tienes que usar Dispatcher.Invoke() en WPF y Control.Invoke() en WinForms.

    OriginalEl autor svick

  5. 0

    probar las siguientes

    ThreadPool.QueueUserWorkItem((o) => { updateProgress(5, 6); });

    OriginalEl autor Zain Shaikh

  6. 0

    He aquí un ejemplo más complejo, sin que los delegados anónimos. Ver el resultado en el terminado de la función.

    using System;
    using System.Threading;
    using System.ComponentModel;
    class Program
    {
    static BackgroundWorker _bw;
    static void Main()
    {
    _bw = new BackgroundWorker
    {
    WorkerReportsProgress = true,
    WorkerSupportsCancellation = true
    };
    _bw.DoWork += bw_DoWork;
    _bw.ProgressChanged += bw_ProgressChanged;
    _bw.RunWorkerCompleted += bw_RunWorkerCompleted;
    _bw.RunWorkerAsync ("Hello to worker");
    Console.WriteLine ("Press Enter in the next 5 seconds to cancel");
    Console.ReadLine();
    if (_bw.IsBusy) _bw.CancelAsync();
    Console.ReadLine();
    }
    static void bw_DoWork (object sender, DoWorkEventArgs e)
    {
    for (int i = 0; i <= 100; i += 20)
    {
    if (_bw.CancellationPending) { e.Cancel = true; return; }
    _bw.ReportProgress (i);
    Thread.Sleep (1000);      //Just for the demo... don't go sleeping
    }                           //for real in pooled threads!
    e.Result = 123;    //This gets passed to RunWorkerCompleted
    }
    static void bw_RunWorkerCompleted (object sender,
    RunWorkerCompletedEventArgs e)
    {
    if (e.Cancelled)
    Console.WriteLine ("You canceled!");
    else if (e.Error != null)
    Console.WriteLine ("Worker exception: " + e.Error.ToString());
    else
    Console.WriteLine ("Complete: " + e.Result);      //from DoWork
    }
    static void bw_ProgressChanged (object sender,
    ProgressChangedEventArgs e)
    {
    Console.WriteLine ("Reached " + e.ProgressPercentage + "%");
    }
    }
    ¿Qué significa para ti «… sin delegados»? Veo varias método implícito grupo de conversiones en su código.
    Utiliza las funciones en lugar de en línea a los delegados. A veces son más fáciles de trabajar y leer especialmente para los nuevos usuarios del hilo.
    Entonces creo que se debe aclarar diciendo «sin anónimo los delegados.» De lo contrario, el OP puede que se pierda por completo el hecho de que un ProgressChangedEventHandler delegado de la instancia se crea, por ejemplo.
    Que es cierto. 🙂

    OriginalEl autor rboarman

Dejar respuesta

Please enter your comment!
Please enter your name here