Ricerca…


Sintassi

  • bgWorker.CancellationPending //returns whether the bgWorker was cancelled during its operation

  • bgWorker.IsBusy //returns true if the bgWorker is in the middle of an operation

  • bgWorker.ReportProgress(int x) //Reports a change in progress. Raises the "ProgressChanged" event

  • bgWorker.RunWorkerAsync() //Starts the BackgroundWorker by raising the "DoWork" event

  • bgWorker.CancelAsync() //instructs the BackgroundWorker to stop after the completion of a task.

Osservazioni

L'esecuzione di operazioni a esecuzione prolungata all'interno del thread dell'interfaccia utente può causare la mancata risposta dell'applicazione, visualizzando all'utente che ha smesso di funzionare. È preferibile che queste attività vengano eseguite su un thread in background. Una volta completata, l'interfaccia utente può essere aggiornata.

Apportare modifiche all'interfaccia utente durante l'operazione di BackgroundWorker richiede il richiamo delle modifiche al thread dell'interfaccia utente, in genere utilizzando il metodo Control.Invoke sul controllo che si sta aggiornando. Trascurare di farlo farà sì che il tuo programma generi un'eccezione.

In genere, BackgroundWorker viene utilizzato solo nelle applicazioni Windows Form. Nelle applicazioni WPF, le attività vengono utilizzate per scaricare il lavoro sui thread in background (eventualmente in combinazione con async / await ). Gli aggiornamenti di marshalling sul thread dell'interfaccia utente vengono in genere eseguiti automaticamente, quando la proprietà da aggiornare implementa INotifyPropertyChanged o manualmente utilizzando il Dispatcher del thread dell'interfaccia utente.

Assegnazione di gestori di eventi a un BackgroundWorker

Una volta che l'istanza di BackgroundWorker è stata dichiarata, è necessario assegnare le proprietà e i gestori di eventi per le attività che esegue.

    /* This is the backgroundworker's "DoWork" event handler. This 
       method is what will contain all the work you 
       wish to have your program perform without blocking the UI. */

    bgWorker.DoWork += bgWorker_DoWork;


    /*This is how the DoWork event method signature looks like:*/
    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Work to be done here   
        // ...
        // To get a reference to the current Backgroundworker:
        BackgroundWorker worker = sender as BackgroundWorker;
        // The reference to the BackgroundWorker is often used to report progress
        worker.ReportProgress(...);
    }

    /*This is the method that will be run once the BackgroundWorker has completed its tasks */

    bgWorker.RunWorkerCompleted += bgWorker_CompletedWork;

    /*This is how the RunWorkerCompletedEvent event method signature looks like:*/
    private void bgWorker_CompletedWork(object sender, RunWorkerCompletedEventArgs e)
    {
        // Things to be done after the backgroundworker has finished
    }

   /* When you wish to have something occur when a change in progress 
     occurs, (like the completion of a specific task) the "ProgressChanged" 
     event handler is used. Note that ProgressChanged events may be invoked
     by calls to bgWorker.ReportProgress(...) only if bgWorker.WorkerReportsProgress
     is set to true.  */

     bgWorker.ProgressChanged += bgWorker_ProgressChanged;

    /*This is how the ProgressChanged event method signature looks like:*/
    private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Things to be done when a progress change has been reported

        /* The ProgressChangedEventArgs gives access to a percentage,
         allowing for easy reporting of how far along a process is*/
        int progress = e.ProgressPercentage;
    }

Assegnazione di proprietà a un BackgroundWorker

Ciò consente a BackgroundWorker di essere annullato tra le attività

bgWorker.WorkerSupportsCancellation = true;

Ciò consente al lavoratore di segnalare lo stato di avanzamento tra il completamento delle attività ...

bgWorker.WorkerReportsProgress = true;

//this must also be used in conjunction with the ProgressChanged event

Creazione di una nuova istanza di BackgroundWorker

Un BackgroundWorker viene comunemente utilizzato per eseguire attività, a volte in termini di tempo, senza bloccare il thread dell'interfaccia utente.

// BackgroundWorker is part of the ComponentModel namespace.
using System.ComponentModel;

namespace BGWorkerExample 
{
     public partial class ExampleForm : Form 
     {

      // the following creates an instance of the BackgroundWorker named "bgWorker"
      BackgroundWorker bgWorker = new BackgroundWorker();

      public ExampleForm() { ...

Utilizzo di BackgroundWorker per completare un'attività.

Nell'esempio seguente viene illustrato l'utilizzo di BackgroundWorker per l'aggiornamento di una barra di avanzamento di WinForms. Lo sfondoWorker aggiornerà il valore della barra di avanzamento senza bloccare il thread dell'interfaccia utente, mostrando così un'interfaccia utente reattiva mentre il lavoro viene eseguito in background.

namespace BgWorkerExample
{
    public partial class Form1 : Form
{

    //a new instance of a backgroundWorker is created.
    BackgroundWorker bgWorker = new BackgroundWorker();
    
    public Form1()
    {
        InitializeComponent();

        prgProgressBar.Step = 1;

        //this assigns event handlers for the backgroundWorker
        bgWorker.DoWork += bgWorker_DoWork;
        bgWorker.RunWorkerCompleted += bgWorker_WorkComplete;

        //tell the backgroundWorker to raise the "DoWork" event, thus starting it.
        //Check to make sure the background worker is not already running.
        if(!bgWorker.IsBusy)
            bgWorker.RunWorkerAsync();
        
    }

    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //this is the method that the backgroundworker will perform on in the background thread.
        /* One thing to note! A try catch is not necessary as any exceptions will terminate the backgroundWorker and report 
          the error to the "RunWorkerCompleted" event */
        CountToY();    
    }

    private void bgWorker_WorkComplete(object sender, RunWorkerCompletedEventArgs e)
    {
        //e.Error will contain any exceptions caught by the backgroundWorker
        if (e.Error != null)
        {
            MessageBox.Show(e.Error.Message);
        }
        else
        {
            MessageBox.Show("Task Complete!");
            prgProgressBar.Value = 0;
        }
    }

    // example method to perform a "long" running task.
    private void CountToY()
    {
        int x = 0;

        int maxProgress = 100;
        prgProgressBar.Maximum = maxProgress;
        

        while (x < maxProgress)
        {
            System.Threading.Thread.Sleep(50);
            Invoke(new Action(() => { prgProgressBar.PerformStep(); }));
            x += 1;
        }
    }


}

Il risultato è il seguente ...

inserisci la descrizione dell'immagine qui inserisci la descrizione dell'immagine qui



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow