Tuesday 11 July 2017

Parallel.For in C# .net 4.0+

Work as iteration. Simple loop is run from a single thread, where as Parallel class uses multiple threads. References :  https://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx



using System;
using System.Threading;
using System.Threading.Tasks;
using static System.Console;
 
namespace Parallel_For_in_CSharp
{
  
    class Program
    {
 
        void LoopCall()
        {
            int count = 10;
            for (int i = 0; i < count; i++)
            {
                WriteLine($"Index:{i}, Thread:{Thread.CurrentThread.ManagedThreadId}");
            }
        }
 
 
        void ParallelCall()
        {
           Parallel.For(0, 10, i =>
            {
                Console.WriteLine($"Index{i}, Thread:{Thread.CurrentThread.ManagedThreadId}");
                Thread.Sleep(100);
            });
        }
 
 
 
        static void Main(string[] args)
        {
            Program obj = new Program();
            WriteLine("---------Simple Loop Calling---------");
            obj.LoopCall();
            WriteLine("---------Parallel.For Calling--------");
            obj.ParallelCall();
            ReadLine();
        }
    }
}

//OutPut
---------Simple Loop Calling---------
Index:0, Thread:1
Index:1, Thread:1
Index:2, Thread:1
Index:3, Thread:1
Index:4, Thread:1
Index:5, Thread:1
Index:6, Thread:1
Index:7, Thread:1
Index:8, Thread:1
Index:9, Thread:1
---------Parallel.For Calling--------
Index0, Thread:1
Index2, Thread:3
Index4, Thread:4
Index6, Thread:5
Index8, Thread:6
Index1, Thread:1
Index3, Thread:3
Index5, Thread:4
Index7, Thread:5
Index9, Thread:6

For Parallel Execution in Parallel.For

ConcurrentBag thread safe list in C#



class Program
    {
        static void Main(string[] args)
        {

            ConcurrentBag bag = new ConcurrentBag();//Thread Safe list

            ParallelOptions options = new ParallelOptions();
            options.MaxDegreeOfParallelism = 5;

            Parallel.For(0, 50, options, o =>
            {
                bag.Add(o);
                Console.Write(Thread.CurrentThread.ManagedThreadId + ",");
                Thread.Sleep(200);
            });

            Console.Read();
        }
    }

Output

1,3,4,5,6,1,3,4,5,6,1,3,4,5,6,1,3,4,5,6,1,3,4,6,5,1,3,5,6,4,1,3,4,6,5,1,3,5,6,4,1,3,5,4,6,1,3,5,6,4


ConcurrentDictionary thread safe dictionary in C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConcurrentDictionary_in_Csharp
{
 
    //https://docs.microsoft.com/en-us/dotnet/standard/collections/thread-safe/how-to-add-and-remove-items
    class Program
    {
 
        static ConcurrentDictionary<intData> dirBag = new ConcurrentDictionary<intData>();
        static void Main(string[] args)
        {
            ParallelOptions options = new ParallelOptions();
            options.MaxDegreeOfParallelism = 5;
 
            Parallel.For(0, 20, options, i =>
            {
                Console.WriteLine($"Index{i}, Thread:{Thread.CurrentThread.ManagedThreadId}");
                var data = new Data { ID = i, Information = "information" + i, LastModifiedDate = DateTime.UtcNow };
                dirBag.AddOrUpdate(
                    1, // i
                    data,
                    (k, v) =>
                    {
                        //Delegate invoke when value exists with corresponding key.
                        v.LastModifiedDate= DateTime.UtcNow; // update last modified date
                        Console.WriteLine("Collected data in to bag. for ID: " + v.ID + ", LastMofifiedDate: " + v.LastModifiedDate);
                        Console.Write($" Bag count existing: " + dirBag.Count);
                        return v;
                    });
                Thread.Sleep(1000);
 
                Console.Write($" Bag count : " + dirBag.Count);
 
            });
 
 
            Console.ReadKey();
        }
    }
 
    class Data
    {
        public int ID { getset; }
        public string Information { getset; }
        public DateTime LastModifiedDate { getset; }
    }
}