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 :)
History
- 5 January 2008: Article submitted.