Click here to Skip to main content
Click here to Skip to main content
Go to top

Type-Strong Asynchronous Execution

, 5 Jan 2008
Rate this:
Please Sign up or sign in to vote.
Executing a method asynchronously with typed parameters.

Introduction

This static class allows the programmer to run a method asynchronously with a single line of code with typed arguments.

Background

Sometimes, a programmer just want some work to be done in the background, and the .NET framework provides several ways of doing just that. You can start a thread and make it call a function, or you can use the ThreadPool.QueueUserWorkItem, but I always felt it was kind of messy. Using ThreadPool forces you to use a WaitCallback delegate if you want to specify any parameters, these need to be boxed into an object and unboxed in the WaitCallback function called.

So, what I wanted was a simple function to call, Util.RunAsync(function, arg1,arg2,arg3...), in a sort of fire and forget way.

Using the Code

The static class Util contains an overloaded function called RunAsync. It is used as such:

public static void Main(string[] args)
{
    string someString = "Hello There";
    int someInteger = 42;
    DateTime someTime = DateTime.Now;

    Util.RunAsync(Function1, someString, someInteger, someTime);
}

public static void Function1(string aString, int anInteger, DateTime time)
{
    Console.WriteLine("{0} {1} {2}", aString, anInteger, time);
}

Points of Interest

The functionality is achieved using the ThreadPool.QueueUserWorkItem the function, and its arguments are wrapped in an ActionJob object that has a subclass for each amount of arguments usable with Util.RunSync. Because it is based on the Action delegate and the generic versions of it Action<T>, Action<T,V>, Action<T,V,X>, and Action<T,V,X,Y>, it can only execute functions with at most four arguments.

You should be able to change the code to work as a Work Queue for invoking with Windows Forms. Instead of running ThreadPool.QueueUserWorkItem, you could do something like this:

public static void DoInvoke<T, V, X, Y>(
              this System.Windows.Forms.Control control, 
              Action<T, V, X, Y> function, T a, V b, X c, Y d)
{
    if (control.InvokeRequired)
    {
        control.Invoke(function, a, b, c, d);
    }
    else
    {
        function(a, b, c, d);
    }
}

Conclusion

That's it. I like this little convenience, and I hope you do too Smile | :)

History

  • 5 January 2008: Article submitted.

License

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

Share

About the Author

Jacob Korsgaard
Other Aalborg University
Denmark Denmark
Jacob is a Computer Science student at Aalborg University Denmark.
 
He has a special interest in Object Oriented and Managed programming languages such as Java and especially C#.
 
Jacob has been developing software professionally and for fun in his spare time for more than 7 years during his studies.

Comments and Discussions

 
QuestionError: Using the generic type 'System.Action<t>' requires '1' type arguments</t> PinmemberCoderJ19-Feb-08 2:04 
GeneralRe: Error: Using the generic type 'System.Action' requires '1' type arguments PinmemberJacob Korsgaard19-Feb-08 3:26 
GeneralRe: Error: Using the generic type 'System.Action' requires '1' type arguments PinmemberCoderJ19-Feb-08 3:49 
GeneralRe: Error: Using the generic type 'System.Action' requires '1' type arguments Pinmemberml_black24-Feb-10 7:22 
QuestionAn easier way? PinmemberHenrik Jonsson7-Jan-08 7:51 
AnswerRe: An easier way? PinmemberFeLiZk8-Jan-08 0:27 
GeneralRe: An easier way? PinmemberHenrik Jonsson10-Jan-08 8:47 

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140916.1 | Last Updated 5 Jan 2008
Article Copyright 2008 by Jacob Korsgaard
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid