BackgroundWorker Class
Runs an operation on a separate thread.
Namespace: System.ComponentModel
Assembly: System (in System.dll)
The BackgroundWorker type exposes the following members.
| Name | Description | |
|---|---|---|
![]() ![]() ![]() | CancellationPending | Gets a value that indicates whether the application has requested cancellation of a background operation. |
![]() ![]() ![]() | IsBusy | Gets a value that indicates whether the BackgroundWorker is running a background operation. |
![]() ![]() ![]() | WorkerReportsProgress | Gets or sets a value that indicates whether the BackgroundWorker can report progress updates. |
![]() ![]() ![]() | WorkerSupportsCancellation | Gets or sets a value that indicates whether the BackgroundWorker supports asynchronous cancellation. |
| Name | Description | |
|---|---|---|
![]() ![]() ![]() | CancelAsync | Requests cancellation of a pending background operation. |
![]() ![]() ![]() | Equals(Object) | Determines whether the specified Object is equal to the current Object. (Inherited from Object.) |
![]() ![]() ![]() | Finalize | Allows an object to try to free resources and perform other cleanup operations before the Object is reclaimed by garbage collection. (Inherited from Object.) |
![]() ![]() ![]() | GetHashCode | Serves as a hash function for a particular type. (Inherited from Object.) |
![]() ![]() ![]() | GetType | Gets the Type of the current instance. (Inherited from Object.) |
![]() ![]() ![]() | MemberwiseClone | Creates a shallow copy of the current Object. (Inherited from Object.) |
![]() ![]() ![]() | OnDoWork | Raises the DoWork event. |
![]() ![]() ![]() | OnProgressChanged | Raises the ProgressChanged event. |
![]() ![]() ![]() | OnRunWorkerCompleted | Raises the RunWorkerCompleted event. |
![]() ![]() ![]() | ReportProgress(Int32) | Raises the ProgressChanged event. |
![]() ![]() ![]() | ReportProgress(Int32, Object) | Raises the ProgressChanged event. |
![]() ![]() ![]() | RunWorkerAsync() | Starts running a background operation. |
![]() ![]() ![]() | RunWorkerAsync(Object) | Starts running a background operation and includes a parameter for use by the background operation. |
![]() ![]() ![]() | ToString | Returns a string that represents the current object. (Inherited from Object.) |
| Name | Description | |
|---|---|---|
![]() ![]() ![]() | DoWork | Occurs when RunWorkerAsync is called. |
![]() ![]() ![]() | ProgressChanged | Occurs when ReportProgress is called. |
![]() ![]() ![]() | RunWorkerCompleted | Occurs when the background operation has completed, has been canceled, or has raised an exception. |
The BackgroundWorker class allows you to run an operation on a separate, dedicated thread. Time-consuming operations, such as downloads and database transactions, can cause your user interface to stop responding. When you want a responsive user interface and you must perform time-consuming operations, the BackgroundWorker class provides a convenient solution.
To run an operation in the background, create a BackgroundWorker. You can listen for events that report the progress of your operation and signal when your operation is completed.
To set up a background operation, add an event handler for the DoWork event. Call your time-consuming operation in this event handler. To start the background operation, call the RunWorkerAsync method. To receive notifications of progress updates, handle the ProgressChanged event. To receive a notification when the operation is completed, handle the RunWorkerCompleted event.
Note: |
|---|
You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the ProgressChanged and RunWorkerCompleted events. |
If your background operation requires a parameter, call RunWorkerAsync with your parameter. Inside the DoWork event handler, you can extract the parameter from the DoWorkEventArgs.Argument property.
For more information about BackgroundWorker, see How to: Use a Background Worker.
The following code example demonstrates the use of the BackgroundWorker class for running a time-consuming operation asynchronously. The time-consuming operation is simulated by calling the background thread's Sleep method. The example periodically reports progress and permits the operation to be canceled.
using System.ComponentModel; using System.Windows; using System.Windows.Controls; namespace SL_BackgroundWorker_CS { public partial class Page : UserControl { private BackgroundWorker bw = new BackgroundWorker(); public Page() { InitializeComponent(); bw.WorkerReportsProgress = true; bw.WorkerSupportsCancellation = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); } private void buttonStart_Click(object sender, RoutedEventArgs e) { if (bw.IsBusy != true) { bw.RunWorkerAsync(); } } private void buttonCancel_Click(object sender, RoutedEventArgs e) { if (bw.WorkerSupportsCancellation == true) { bw.CancelAsync(); } } private void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; for (int i = 1; (i <= 10); i++) { if ((worker.CancellationPending == true)) { e.Cancel = true; break; } else { // Perform a time consuming operation and report progress. System.Threading.Thread.Sleep(500); worker.ReportProgress((i * 10)); } } } private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if ((e.Cancelled == true)) { this.tbProgress.Text = "Canceled!"; } else if (!(e.Error == null)) { this.tbProgress.Text = ("Error: " + e.Error.Message); } else { this.tbProgress.Text = "Done!"; } } private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%"); } } }
<UserControl x:Class="SL_BackgroundWorker_CS.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <StackPanel Height="30" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10" > <Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click" Width="80" Height="30"/> <Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click" Width="80" Height="30"/> </StackPanel> <StackPanel Margin="10,50,0,0" Orientation="Horizontal"> <TextBlock Text="Progress: "/> <TextBlock x:Name="tbProgress"/> </StackPanel> </Grid> </UserControl>
<UserControl x:Class="SL_BackgroundWorker_VB.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <StackPanel Height="30" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10" > <Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click" Width="80" Height="30"/> <Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click" Width="80" Height="30"/> </StackPanel> <StackPanel Margin="10,50,0,0" Orientation="Horizontal"> <TextBlock Text="Progress: " /> <TextBlock x:Name="tbProgress" /> </StackPanel> </Grid> </UserControl>
For a list of the operating systems and browsers that are supported by Silverlight, see Supported Operating Systems and Browsers.

