Solution 1:

You could use a BackgroundWorker and then change the UI like this:

control.Invoke((MethodInvoker)delegate {
    control.Enabled = true;
});

Solution 2:

If you are using C# 3.5, it is really easy to use extension methods and lambdas to prevent updating the UI from other threads.

public static class FormExtensions
{
  public static void InvokeEx<T>(this T @this, Action<T> action) where T : Form
  {
    if (@this.InvokeRequired)
    {
      @this.Invoke(action, @this);
    }
    else
    {
      action(@this);
    }
  }
}

So now you can use InvokeEx on any form and be able to access any properties/fields that aren't part of Form.

this.InvokeEx(f => f.label1.Text = "Hello");

Solution 3:

I assume we're talking WinForms here? You need to have a single thread managing this - the thread that created the control in question. If you want to do this from a different thread, which you can detect using Control.InvokeRequired, then you should use the Control.Invoke method to marshall this onto the correct thread. Google that property and method (respectively) for some common patterns in doing this.

Solution 4:

How about using Win Form's BackgroundWorker class instead of manual thead synchronization implemenation?