using System;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
namespace TestAsync
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // inherently synchrononous operation
        public int ComputeSomething(int n)
        {
            // Problem is O(N)
            while (n-- > 0)
                Thread.Sleep(1000);
            return 7;
        }
        // Wrap the synchronous operation on Task-based Async Pattern to make the operation operate asynchronously
        Task<int> ComputeSomethingAsync(int n)
        {
            Task<int> t = new Task<int>(() =>
                {
                    return ComputeSomething(n);
                });
            t.Start();
            return t;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // instead of doing things synchronously
            if (false)
            {
                int n = ComputeSomething(10);
                MessageBox.Show("Returned value is " + n.ToString());
            }
            // do things asynchronously instead
            if (true)
            {
                Task<int> t = ComputeSomethingAsync(10);
                t.ContinueWith(x =>
                {
                    if (x.IsFaulted)
                    {
                        MessageBox.Show(x.Exception.Message);
                    }
                    else
                    {
                        MessageBox.Show("Returned value is " + x.Result.ToString());
                    }
                });
            }
        }//button1_Click
    }//class Form1
}
For asynchronous operation, TAP asynchronous design pattern is easier to use than BeginXXX, EndXXX, IAsyncResult combo async pattern
On next C# version(C# 5), making routines asynchronous will be a lot easier with its built-in await and async functionality
