C# Language
BackgroundWorker
Szukaj…
Składnia
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.
Uwagi
Wykonywanie długotrwałych operacji w wątku interfejsu użytkownika może spowodować, że aplikacja przestanie odpowiadać, wyświetlając się użytkownikowi, że przestała działać. Zaleca się uruchamianie tych zadań w wątku w tle. Po zakończeniu interfejs użytkownika można zaktualizować.
Wprowadzanie zmian w interfejsie użytkownika podczas operacji BackgroundWorker wymaga wywołania zmian w wątku interfejsu użytkownika, zwykle przy użyciu metody Control.Invoke w kontrolowanym elemencie. Zaniedbanie tego spowoduje, że Twój program zgłosi wyjątek.
BackgroundWorker jest zwykle używany tylko w aplikacjach Windows Forms. W aplikacjach WPF zadania służą do odciążenia pracy w wątkach w tle (być może w połączeniu z asynchronizacją / czekaniem ). Aktualizacje Marshalling w wątku interfejsu użytkownika są zwykle wykonywane automatycznie, gdy aktualizowana właściwość implementuje INotifyPropertyChanged , lub ręcznie za pomocą programu rozsyłającego wątek interfejsu użytkownika.
Przypisywanie programów obsługi zdarzeń do BackgroundWorker
Po zadeklarowaniu wystąpienia BackgroundWorker należy mu nadać właściwości i procedury obsługi zdarzeń dla wykonywanych zadań.
/* 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;
}
Przypisywanie właściwości do BackgroundWorker
Umożliwia to anulowanie BackgroundWorker pomiędzy zadaniami
bgWorker.WorkerSupportsCancellation = true;
Dzięki temu pracownik może zgłaszać postępy między realizacją zadań ...
bgWorker.WorkerReportsProgress = true;
//this must also be used in conjunction with the ProgressChanged event
Tworzenie nowej instancji BackgroundWorker
BackgroundWorker jest zwykle używany do wykonywania zadań, czasem czasochłonnych, bez blokowania wątku interfejsu użytkownika.
// 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() { ...
Korzystanie z BackgroundWorker do wykonania zadania.
Poniższy przykład demonstruje użycie BackgroundWorker do aktualizacji WinForms ProgressBar. BackgroundWorker zaktualizuje wartość paska postępu bez blokowania wątku interfejsu użytkownika, pokazując w ten sposób reaktywny interfejs użytkownika podczas pracy w tle.
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;
}
}
}