static void Main(string[] args) {

            // create the bank account instance
            BankAccount account = new BankAccount();

            // create an array of tasks
            Task<int>[] tasks = new Task<int>[10];

            for (int i = 0; i < 10; i++) {
                // create a new task
                tasks[i] = new Task<int>((stateObject) => {

                    // get the state object
                    int isolatedBalance = (int)stateObject;

                    // enter a loop for 1000 balance updates
                    for (int j = 0; j < 1000; j++) {
                        // update the balance
                        isolatedBalance++;
                    }

                    // return the updated balance
                    return isolatedBalance;

                }, account.Balance);

                // start the new task
                tasks[i].Start();
            }

            // get the result from each task and add it to
            // the balance
            for (int i = 0; i < 10; i++) {
                account.Balance += tasks[i].Result;
            }

            // write out the counter value
            Console.WriteLine("Expected value {0}, Balance: {1}",
                10000, account.Balance);

            // wait for input before exiting
            Console.WriteLine("Press enter to finish");
            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            Task<BankAccount> rootTask = new Task<BankAccount>(() => {
                // create a new bank account
                BankAccount account = new BankAccount();
                // enter a loop
                for (int i = 0; i < 1000; i++) {
                    // increment the account total
                    account.Balance++;
                }
                // return the bank account
                return account;
            });

            // create the second generation task, which will double the antecdent balance
            Task<int> continuationTask1
                = rootTask.ContinueWith<int>((Task<BankAccount> antecedent) => {
                    Console.WriteLine("Interim Balance 1: {0}", antecedent.Result.Balance);
                    return antecedent.Result.Balance * 2;
                });

            // create a third generation task, which will print out the result
            Task continuationTask2
                = continuationTask1.ContinueWith((Task<int> antecedent) => {
                    Console.WriteLine("Final Balance 1: {0}", antecedent.Result);
                });

            // create a second and third generation task in one step
            rootTask.ContinueWith<int>((Task<BankAccount> antecedent) => {
                Console.WriteLine("Interim Balance 2: {0}", antecedent.Result.Balance);
                return antecedent.Result.Balance / 2;
            }).ContinueWith((Task<int> antecedent) => {
                Console.WriteLine("Final Balance 2: {0}", antecedent.Result);
            });

            // start the task
            rootTask.Start();

            // wait for input before exiting
            Console.WriteLine("Press enter to finish");
            Console.ReadLine();
        }