Click here to Skip to main content
15,867,568 members
Articles / General Programming / Threads
Tip/Trick

Multi-threading in .NET 4

Rate me:
Please Sign up or sign in to vote.
4.20/5 (4 votes)
11 Apr 2012CPOL 35K   21   5
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)


Written By
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionC# Parallel.For multi thread parallel Pin
ytyet20058-Oct-14 14:30
ytyet20058-Oct-14 14:30 
QuestionMight be nice to put some timings in the output Pin
kevinbrydon11-Apr-12 23:03
kevinbrydon11-Apr-12 23:03 
QuestionWhy are you using WinAPI to get a number of processors? Pin
Laserson9-Apr-12 18:49
Laserson9-Apr-12 18:49 
AnswerRe: Why are you using WinAPI to get a number of processors? Pin
John Brett9-Apr-12 21:49
John Brett9-Apr-12 21:49 
GeneralRe: Why are you using WinAPI to get a number of processors? Pin
daylightdj12-Apr-12 5:11
daylightdj12-Apr-12 5:11 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.