C# Background Worker Tutorial

12
2/21/2014 C# BackgroundWorker Tutorial http://www.dotnetperls.com/backgroundworker 1/12 C# BackgroundWorker BackgroundWorker makes threads easy to implement in Windows Forms. Intensive tasks need to be done on another thread so the UI does not freeze. It is necessary to post messages and update the user interface when the task is done. Thread Steps In the image, you see the Visual Studio designer view. The fly-out panel is the Toolbox—it contains links for all kinds of controls. It also contains the BackgroundWorker link, which we can use in the following steps. First, click on BackgroundWorker. You will need to double-click on BackgroundWorker link in the Toolbox. Look at the gray bar near the bottom of your window. A BackgroundWorker will appear there. Go C#: Windows

description

A tutorial about how background worker is used with C#

Transcript of C# Background Worker Tutorial

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 1/12

    C# BackgroundWorker

    BackgroundWorker makes

    threads easy to implement in

    Windows Forms. Intensive tasks

    need to be done on another thread

    so the UI does not freeze. It is

    necessary to post messages and

    update the user interface when the

    task is done.

    Thread

    StepsIn the image, you see the Visual

    Studio designer view. The fly-out

    panel is the Toolboxit contains

    links for all kinds of controls. It also contains the

    BackgroundWorker link, which we can use in the following steps.

    First, click on BackgroundWorker. You

    will need to double-click on

    BackgroundWorker link in the Toolbox.

    Look at the gray bar near the bottom of

    your window. A BackgroundWorker will

    appear there.

    Go

    C#: Windows

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 2/12

    Second:

    Highlight backgroundWorker1. Click on the

    backgroundWorker1 item in the gray bar on the bottom. Now,

    look at the Properties panel.

    Third:

    Look for the lightning bolt.

    You will see a lightning bolt icon in the Properties pane.

    This is Microsoft's icon for events.

    Tip:

    BackgroundWorker is event-driven, so this is where we will

    make the necessary events to use it.

    Then, double-click on DoWork. Sorry, but we have to begin

    working. Double-click on DoWork, which will tell Visual Studio to

    make a new "work" method. In this method, you will put the

    important, processor-intensive stuff.

    Windows Forms

    C# Visual Studio

    VB Net

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 3/12

    The rectangles show the tray at the bottom

    containing the backgroundWorker1 icon, and

    the Properties panel on the right. The lightning

    bolt helps us easily add events to the

    BackgroundWorker.

    Tip:

    This UI is far better than trying to type the methods in

    manually. It requires less effort on your part.

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 4/12

    DoWorkThe DoWork method is like any other event

    handler. Here we must look at the C# view

    of your file, where we will see the DoWork

    method. You should see that the

    backgroundWorker1_DoWork event is

    generated when you double-click on DoWork.

    For testing, let's add a Thread.Sleep

    command there. The Thread.Sleep method will pause the

    execution of the BackgroundWorker, but does not consume the

    entire CPU. It will show us threading is functioning.

    Sleep

    Example that shows DoWork event handler: C#

    using System;using System.ComponentModel;using System.Windows.Forms;using System.Threading;

    namespace WindowsFormsApplication1{ public partial class Form1 : Form { public Form1() { InitializeComponent(); }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 5/12

    Thread.Sleep(1000); // One second. } }

    }

    PropertiesI want to emphasize the

    Argument, Result, and the

    RunWorkerAsync methods. These

    are the properties of

    BackgroundWorker required to

    accomplish anything. I show the

    properties as you would reference

    them in your code.

    BackgroundWorker property list: C#

    DoWorkEventArgs e Contains e.Argument and e.Result. It is used to access those properties.

    e.Argument Used to get the parameter reference received by RunWorkerAsync.

    e.Result Check to see what the BackgroundWorker processing did.

    backgroundWorker1.RunWorkerAsync Called to start a process on the worker thread.

    RunWorkerAsync

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 6/12

    We can add instructions to the

    BackgroundWorker by adding

    arguments and return values. We need

    to add arguments, invoke the

    BackgroundWorker, and then receive

    the results of the thread.

    Tip:

    Changing variables from multiple threads at once often leads

    to bugs. A variable can become invalid.

    Example that shows RunWorkerAsync call: C#

    public partial class Form1 : Form{ public Form1() { InitializeComponent();

    // // Example argument object // TestObject test = new TestObject { OneValue = 5, TwoValue = 4 }; // // Send argument to our worker thread // backgroundWorker1.RunWorkerAsync(test); }}

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 7/12

    /// /// The test class for our example./// class TestObject{ public int OneValue { get; set; } public int TwoValue { get; set; }}

    An example argument is created. TestObject

    in the above code is an example object. You will

    have something more important and complex in

    your program. The syntax above is just C#

    collection initializer syntax.

    Tip:

    RunWorkerAsync can be called anywhere in

    your code. We use a constructor, but that isn't important.

    DoWork 2You can implement DoWork by

    putting your expensive code in it.

    Then, use the DoWorkEventArgs in its

    body and as its result. Here we hook

    up the arguments and results from

    the RunWorkerAsync call.

    Note:

    The TestObject was passed to RunWorkerAsync, and that is

    received as e.Argument. We also have to cast.

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 8/12

    Example that implements DoWork: C#

    /// /// Where we do the work in the program (the expensive slow stuff)./// private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){ // // e.Argument always contains whatever was sent to the background worker // in RunWorkerAsync. We can simply cast it to its original type. // TestObject argumentTest = e.Argument as TestObject;

    // // Boring.... // Thread.Sleep(10000);

    argumentTest.OneValue = 6; argumentTest.TwoValue = 3;

    // // Now, return the values we generated in this method. // ... Use e.Result. // e.Result = argumentTest;}

    RunWorkerCompletedYou can use the RunWorkerCompleted event

    handler by going to the lightning bolt in the

    designer and clicking on the backgroundWorker1

    icon in the tray. Now double-click in

    RunWorkerCompleted.

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 9/12

    Next:

    You will get some autogenerated code that looks just like this.

    Put the argument receiving code in this method.

    Example that shows RunWorkerCompleted event handler: C#

    /// /// This is on the main thread, so we can update a TextBox or anything./// private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){ // // Receive the result from DoWork, and display it. // TestObject test = e.Result as TestObject; this.Text = test.OneValue.ToString() + " " + test.TwoValue.ToString();

    // // Will display "6 3" in title Text (in this example) //}

    DiscussionYou probably know more than you

    think about the BackgroundWorker

    class. BackgroundWorker has a name

    that might indicate it is more complex

    than it really is. There are many more

    details about threading and abort

    calls.

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 10/12

    However:

    Once you understand that BackgroundWorker is just a

    structural overlay to threads in Windows Forms, it is intuitive.

    First, call RunWorkerAsync with an

    argument. You can pass any

    argument to this method on

    BackgroundWorker, including null. It

    simply must inherit from object,

    which everything does.

    Second:

    Custom processing is run.

    Your expensive code is executed

    in the DoWork method.

    Insert pause here as your

    program works.

    Third:

    It finishes.

    When your processing is done, RunWorkerCompleted is called.

    In this method, you receive the result.

    ProgressBarA ProgressBar visually displays progress. And the ProgressBar

    control in Windows Forms can be used with a BackgroundWorker.

    This site has a detailed tutorial on how to use these controls

    together.

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 11/12

    ProgressBar

    Also:

    The WPF ProgressBar is

    covered.

    It too can be used with a

    BackgroundWorker control.

    ProgressBar

    SummaryWe implemented the code for a

    BackgroundWorker control. We

    generally instead prefer ThreadPool

    when we need many threads. And

    threads are not always useful. IO

    operations, for example, cannot

    always be multithreaded well.

    Thus:

    With the era of multiple processor systems, we need threads.

    And BackgroundWorker is an excellent shortcut.

    C# Testing

    C# Programming Tutorial

    Test C# Code

  • 2/21/2014 C# BackgroundWorker Tutorial

    http://www.dotnetperls.com/backgroundworker 12/12

    C# Forumwww.daniweb.com

    Free Answers to Your Programming Questions from our Savvy Community