Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / programming / threads

Multi-threading in .NET 4

4.20/5 (4 votes)
11 Apr 2012CPOL 35.7K  
Huge improvement on Multithreading in new Task Parallel Library for .NET 4

Introduction

The purpose of this code is to demonstrate how new TPL (Task Parallel Library) of .NET 4 utilize available multi core.<o:p>

Background

Before TPL we have to do thread management. But now that responsibility is taken by TPL.<o:p>

We still have to deal with data integrity (such as critical section data race and deadlock), but at least bigger part is taken from our shoulder.

The Parallel class is defined under the System.Threading.Tasks namespace and the following code demo shows the benefits of using the Parallel class if you want to use multi-threading.

C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Threads
{
    class Program
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int GetCurrentProcessorNumber();

        private static int criticalSection = 0;
        private static object lockObject = new object();

        static void Main(string[] args)
        {
            Console.WriteLine("==================Sequential calls==============");
            Console.WriteLine();
            
            // Get the number of processor.
            int numberOfProcessors = Environment.ProcessorCount;
            for (int i = 0; i < numberOfProcessors; i++)
            {
                Target();
            }

            Console.WriteLine();

            Console.WriteLine("==================Parallel calls==============");
            Console.WriteLine();
            Action action = new Action(Target);

            List<Action> parallelTaskList = new List<Action>();

            // Create equal number of task as number of processor. I hope each thread will execute in seperate processor. We will find out.
            for (int i = 0; i < numberOfProcessors; i++)
            {
                parallelTaskList.Add(action);
            }

            Parallel.Invoke(parallelTaskList.ToArray());

            Console.WriteLine("Finished");

            Console.ReadKey();
        }

        private static void Target()
        {
            Thread.Sleep(2000);
            
            lock (lockObject)
            {
                criticalSection++;
                Console.WriteLine(string.Format("Thread ID: {0} and Processor ID: {1} Critical Variable Value: {2}", Thread.CurrentThread.ManagedThreadId, GetCurrentProcessorNumber(), criticalSection));
            }

        }

    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)