Click here to Skip to main content
Click here to Skip to main content

A common class for executing tasks with a responsive UI

By , 24 Jan 2009
 

1.jpg

Introduction

This is a common way to implement the standard WinForms behavior of executing a potentially long running action while still having the UI be responsive and allowing the user to know that something is happening via the UI. This can be used with standard WinForms, WPF, or an MVP style application which is how I use it.

Background

Some of the other options which I felt weren't as easy as this to use:

Using the code

Download the source and hit F5 - three examples are given:

  • The standard behavior where the UI locks while executing.
  • The new behavior where the UI is not locked and the user can tell the form is busy.
  • What happens in the new behavior when an exception is thrown.

In order to use this, the form or view in question must implement the interface IThreadedExecuterView, in either the form itself or in a base form:

public partial class Form1 : Form, IThreadedExecuterView
{

#region IThreadedExecuterView Members
public void SetWait(bool isEnabled)
{
     this.Cursor = (isEnabled ? Cursors.Default : Cursors.WaitCursor);
     button1.Enabled = button2.Enabled = isEnabled;
}

public void HandleException(Exception ex)
{
     MessageBox.Show("This is your standard error " + 
                     "handling call here for " + ex.Message);
}

Below is an example of it in use - there is no need to worry about the UI thread, creating delegates, or doing anything special for exceptions other than handling them in one place.

using (ThreadedExecuter<BusinessObject> executer = 
         new ThreadedExecuter<BusinessObject>(this))
{
     executer
          .Process(() =>
          {
               return GetData(); //executes in background worker
          })
          .WhenFinished(businessObject =>
          {
               UseData(businessObject); //executes on UI thread
          })
     .Run();
}

It works for value types or reference types. Here is a Unit Test demonstrating its usage:

[Test]
public void TestThreadedExecuterNormalBehavior()
{
     int result = 0;
     bool didComplete = false;
     AutoResetEvent waiter = new AutoResetEvent(false);
     IThreadedExecuterView view = 
        MockRepository.GenerateStub<IThreadedExecuterView>();
     using (ThreadedExecuter<int> worker = new ThreadedExecuter<int>(view))
     {
          worker
               .Process(()=>
               {
                    Thread.Sleep(1000);
                    return 42;
               })
               .WhenFinished(workerResult => 
               {
                    result = workerResult;
                    didComplete = true;
                    waiter.Set();
               })
          .Run();
     }

     waiter.WaitOne(2000, false);
     Assert.AreEqual(42, result);
     Assert.IsTrue(didComplete);
}

History

  • 24-Jan-2009 - Initial version.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Paul B.
United States United States
Member
I've been a software developer since 1996 and have enjoyed C# since 2003. I have a Bachelor's degree in Computer Science and for some reason, a Master's degree in Business Administration. I currently do software development contracting/consulting.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralThanx,memberjohn_max5 Dec '09 - 9:44 
GeneralHi paul ThanksmemberDanie de Kock27 Jul '09 - 21:47 
GeneralNice mechanismmembercolonel72023 Jun '09 - 10:54 
GeneralRe: Nice mechanismmemberPaul B.23 Jun '09 - 11:10 
Questionvoid as a return type?memberuffejz22 Apr '09 - 22:23 
AnswerRe: void as a return type? [modified]memberDanie de Kock27 Jul '09 - 21:46 
GeneralRe: void as a return type?memberuffejz27 Jul '09 - 23:04 
GeneralRe: void as a return type?memberDanie de Kock27 Jul '09 - 23:29 
GeneralRe: void as a return type? SorrymemberDanie de Kock27 Jul '09 - 23:33 
GeneralRe: void as a return type? Sorrymemberuffejz27 Jul '09 - 23:40 
GeneralRe: void as a return type? SorrymemberDanie de Kock27 Jul '09 - 23:46 
GeneralRe: void as a return type? Sorrymemberuffejz27 Jul '09 - 23:54 
GeneralRe: void as a return type?memberuffejz27 Jul '09 - 23:51 
AnswerThank youmemberDanie de Kock27 Jul '09 - 23:53 
GeneralRe: Thank youmemberuffejz28 Jul '09 - 2:30 
GeneralRe: Thank youmemberDanie de Kock28 Jul '09 - 3:43 
GeneralRe: Thank youmemberuffejz28 Jul '09 - 4:11 
GeneralRe: Thank youmemberDanie de Kock28 Jul '09 - 4:35 
GeneralRe: Thank youmemberuffejz28 Jul '09 - 12:17 
GeneralRe: Thank youmemberDanie de Kock28 Jul '09 - 20:27 
Generalgood classmemberDonsw19 Feb '09 - 14:52 
GeneralKill threadmembermgrounds11 Feb '09 - 4:35 
GeneralRe: Kill threadmembermgrounds11 Feb '09 - 23:07 
GeneralRe: Kill threadmembermgrounds12 Feb '09 - 5:54 
GeneralRe: Kill threadmemberPaul B.14 Feb '09 - 3:10 
GeneralRe: Kill threadmembermgrounds15 Feb '09 - 23:47 
GeneralRe: Kill threadmemberPaul B.16 Feb '09 - 4:39 
GeneralRe: Kill threadmemberuffejz22 Apr '09 - 22:35 
GeneralRe: Kill threadmemberDanie de Kock28 Jul '09 - 23:06 
GeneralRe: Kill threadmemberDanie de Kock28 Jul '09 - 23:24 
GeneralUnit Test Code FailsmemberHenrik Jonsson27 Jan '09 - 9:06 
GeneralRe: Unit Test Code FailsmemberPaul B.27 Jan '09 - 15:31 
GeneralRe: Unit Test Code FailsmemberHenrik Jonsson28 Jan '09 - 8:26 
GeneralMVP usagememberPaul B.26 Jan '09 - 4:23 
GeneralMy vote of 2memberProJester125 Jan '09 - 8:03 
GeneralRe: My vote of 2memberPaul B.25 Jan '09 - 11:57 
GeneralRe: My vote of 2memberPaul B.25 Jan '09 - 12:00 
GeneralRe: My vote of 2memberJon_Boy20 May '09 - 9:39 
GeneralMVPmemberuffejz25 Jan '09 - 3:04 
GeneralRe: MVPmemberPaul B.25 Jan '09 - 4:08 
GeneralRe: MVPmemberuffejz25 Jan '09 - 6:41 
GeneralRe: MVPmemberPaul B.25 Jan '09 - 12:04 
GeneralRe: MVPmemberuffejz26 Jan '09 - 1:20 
GeneralRe: MVPmemberuffejz29 Jan '09 - 4:21 
GeneralRe: MVPmemberuffejz19 Feb '09 - 0:41 
GeneralRe: MVPmemberPaul B.19 Feb '09 - 14:08 
GeneralRe: MVPmemberuffejz23 Feb '09 - 21:52 
GeneralRe: MVPmemberPaul B.12 Mar '09 - 16:26 
GeneralRe: MVP [modified]memberuffejz15 Mar '09 - 1:44 
GeneralRe: MVPmemberPaul B.15 Mar '09 - 3:47 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 24 Jan 2009
Article Copyright 2009 by Paul B.
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid