Tuesday, January 25, 2011

Asynchronous Control Updates In C#/.NET/WinForms

Every .NET WinForms project I've written, since .NET 2.0, has included some form of this code:

public static class ControlExtensions
{
 public static void Do<TControl>(this TControl control, Action<TControl> action)
   where TControl: Control
 {
   if (control.InvokeRequired)
     control.Invoke(action, control);
   else
     action(control);
 }
}

It's a simple extension method that allows any UI control to update itself when called from an asynchronous method - whether it's running from a .BeginInvoke() call, a BackgroundWorker, a ThreadPool thread, or any other form of asynchronous call. It's simple and effective in managing UI updates from asynchronous methods.

I'm currently using it to update a progress bar, like this:

private void SetProgress(int percentage)
{
 updateProgressBar.Do(ctl =>
 {
   ctl.Value = percentage;
 });
}

The best part is that it's aware of the control type through the use of generics. You don't have to cast from a generic Control type so that you can access the specific methods and properties of your specific control type.

Read more: LosTechies