async/await

Example:

private int slowFunc(int a, int b)
{
   System.Threading.Thread.Sleep(10000);
   return a + b;
}

In C# 4.0, you have to use ContinueWith():

private void btnProcessTask_Click(object sender, EventArgs e)        
{
   this.btnProcessTask.Enabled = false;          
   var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();  // get UI thread context 
   var someTask = Task<int>.Factory.StartNew(() => slowFunc(1, 2));      // create and start the Task 
   someTask.ContinueWith(x =>     
     {                                          
        this.lblTaskResults.Text = "Result: " + someTask.Result.ToString();   
        this.btnProcessTask.Enabled = true;   
     }, uiScheduler  
    );        
}

In C# 5.0, you can use async/await:

private async void btnProcessTask_Click(object sender, EventArgs e)
{
   this.btnProcessTask.Enabled = false; 
   var someTask = Task<int>.Factory.StartNew(() => slowFunc(1, 2)); 
   await someTask;  
   this.lblTaskResults.Text = "Result: " + someTask.Result.ToString(); 
   this.btnProcessTask.Enabled = true;
}
References