C# Parallel ForEach | C# Parallel For

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

C# Parallel ForEach | C# Parallel For: Parallel ClassTPL की एक मुख्‍य Class है। ये Class बहुत सारे Methods को Support करता है, जो हमें Parallel Fashion में Stored Data के Collection को Iterate करने की सुविधा Provide करते हैं। ये Class मूल रूप से Parallel.For()Parallel.ForEach() नाम के दो Static Methods Provide करता है और इन दोनों के ही बहुत सारे Overloaded Versions हैं।

इन Methods को क्रमश: for Loop व foreach Loop की तरह Use करते हुए Parallel Methods को Run कर सकते हैं। ये दोनों ही Methods Data Parallelism को Support करते हैं, जिसमें सभी Tasks समान Data को Parallel Form में Access व Manipulate करने की क्षमता प्राप्त करते हैं।

ये Methods हमें ऐसा Code Block Specify करने की सुविधा देते हैं, जो कि Parallel Manner में Process होते हैं। Conceptually समझें तो ये दोनों Methods Normal Looping Statement की तरह ही है। इस Parallel Class का मुख्‍य फायदा ये है कि ये Thread Pool से Threads को प्राप्त करते हैं और हमारी जरूरत के अनुसार Concurrently Run करते हैं।

इन दोनों ही Methods में IEnumerable या IEnumerable<T> Compatible Container को Specify करना होता है, जो उन Data को Hold करते हैं, जिन्हें Parallel Manner में Process करना होता है। Container के रूप में हम किसी Simple Array, Non-Generic Collection (ArrayList), Generic Collection (List<T>) या किसी LINQ Query के Result को Specify कर सकते हैं।

साथ ही हमें System.Func<T> System.Action<T> Delegates को उन Target Methods को Point करने के लिए Use करना होता है, जो Data को Process करने के लिए Call होते हैं।

System.Func<T> एक ऐसे Method को Represent करता है, जो कोई Specific Value Return करता है और Varied Number of Arguments Accept करता है। जबकि Action<T> Delegate Func<T> के समान ही ऐसे Method को Point करता है, जो कुछ Parameters Accept कर सकता है लेकिन कोई Value Return नहीं करता।

हालांकि हम Parallel.For() Parallel.ForEach() Methods को Call कर सकते हैं और इनमें Strongly Typed Func<<T> या Action<T> Delegate Object Pass कर सकते हैं, फिर भी हम हमारी Programming को सरल बना, रखने के लिए C# Anonymous Methods या Lambda Expressions का भी प्रयोग कर सकते हैं।

इसी Class में Invoke() नाम का एक और Static Method होता है, जो दो या अधिक Methods को Parallel तरीके से Invoke करने का काम करता है। परिणामस्वरूप ये Task Parallelism को Support करता है।

ये तीनों ही Methods हमें आसानी से Parallelism की सुविधा Provide करते हुए Parallelism Programming Techniques के माध्‍यम से Task या Threads को Explicitly Manage करने की सुविधा Provide करते हैं।

Parallelizing Tasks via Invoke() Method

Invoke() Method हमें उन tasks को Parallel Manner में Execute करने की सुविधा Provide करता है, जिन्हें हम इस Method में Parameter की तरह Specify करते हैं। इस Method को निम्नानुसार तरीके से Define किया गया है:

public static void Invoke(params Action[ ] actions)

जिन Tasks को हमें इस Method द्वारा Invoke करना होता है, वे सभी Action Delegate के Compatible होने जरूरी होते हैं। यानी हम इस Method द्वारा केवल No-Argument No-Return Value Methods को ही Execute कर सकते हैं।

जब हम Invoke() Method को Use करते हैं, तो ये Method सभी Specified Tasks के पूरी तरह से Execute होने तक Wait करता है। इसलिए हमें Manually Wait() Method को Call करने की जरूरत नहीं होती। यानी Tasks को Parallel Form में Execute करने के लिए हर जरूरी काम ये Method स्वयं अपने स्तर पर ही कर लेता है।

हालांकि जब हम इस Method को Use करते हैं तो इस बात की कोई Guarantee नहीं होती कि सभी Tasks Parallel Form में ही Execute होंगे। लेकिन यदि हमारा Computer Multi-Core या Multi-CPU Based हो तो ये Method सभी Tasks को Parallel Form में ही Invoke करता है। साथ ही जब हम इस Method को Use करते हैं तो Tasks के Execution का क्रम निश्चित नहीं होता।

File Name: ParallelProgramming-InvokeMethod.cs
using System;
using System.Threading;
using System.Threading.Tasks;

namespace CSharpMultiThreading
{
    class DemoCancelTask
    {
        // A method to be run as a task.
        static void MyTask()
        {
            Console.WriteLine("MyTask() starting");
            for (int count = 0; count < 5; count++)
            {
                Thread.Sleep(500);
                Console.WriteLine("In MyTask(), count is " + count);
            }
            Console.WriteLine("MyTask terminating");
        }

        // A method to be run as a task.
        static void YourTask()
        {
            Console.WriteLine("YourTask() starting");
            for (int count = 0; count < 5; count++)
            {
                Thread.Sleep(500);
                Console.WriteLine("In YourTask(), count is " + count);
            }
            Console.WriteLine("YourTask terminating");
        }

        static void Main()
        {
            Console.WriteLine("Main thread starting.");
            Parallel.Invoke(MyTask, YourTask);
            Console.WriteLine("Main thread ending.");
        }
    }
}

Output:
MyTask() starting
YourTask() starting
In MyTask(), count is 0
In YourTask(), count is 0
In MyTask(), count is 1
In YourTask(), count is 1
In MyTask(), count is 2
In YourTask(), count is 2
In MyTask(), count is 3
In YourTask(), count is 3
In MyTask(), count is 4
MyTask terminating
In YourTask(), count is 4
YourTask terminating
Main thread ending.

इस Program में मुख्‍य रूप से ध्‍यान देने वाली बात ये है कि Main Thread तब तक Blocked रहता है, जब तक कि Invoke() Method के सभी Tasks Complete नहीं हो जाते। इसीलिए Main Thread सबसे बाद में End होता है और हमें Console में Main Thread एक Ending Message सबसे बाद में दिखाई देता है, क्योंकि Main Thread तब तक के लिए Block हो जाता है, जब तक कि Invoke() Method में Specified सभी Tasks Complete नहीं हो जाते।

Parallel LINQ (PLINQ)

हमने इस पुस्तक में LINQ Queries के माध्‍यम से किसी Collection को Enumerate करने के बारे जाना था। उस Chapter में हमने LINQ के जिन Concepts को समझा था, वे सभी केवल Single Threaded Application पर ही उपयोगी होते हैं।

लेकिन TPL हमें ऐसे LINQ Methods Provide करता है, जिन्हे Use करके हम ऐसी LINQ Queries Create कर सकते हैं, जो कि Multi-Threaded या Parallel Execution के विभिन्न Methods पर समान रूप से Use की जा सकती हैं। Parallel Manner में Fire की जा सकने वाली LINQ Queries को .NET 4.0 में PLINQ नाम से Introduce किया गया है।

चूंकि PLINQ को TPL में Define किया गया है, जिसका कारण यही है कि जब हम किसी Application में किसी LINQ Query को Use करते हैं, और CLR को लगता है कि हमारे LINQ Query को Parallel Form में Use करने पर ज्यादा Performance प्राप्त हो सकती है, तो CLR Automatically उस Query को Parallel तरीके से Use कर लेता है।

PLINQ से सम्बंधित जरूरी Extension Methods को System.Linq Namespace की ParallelEnumerable Class में Define किया गया है। जिसके कुछ उपयोगी Extension Methods निम्नानुसार हैं:

Member Meaning in Life
AsParallel() Specifies that the rest of the query should be parallelized, if possible.
WithCancellation() Specifies that PLINQ should periodically monitor the state of the provided cancellation token and cancel execution if it is requested.
WithDegreeOfParallelism() Specifies the maximum number of processors that PLINQ should use to parallelize the query.
ForAll() Enables results to be processed in parallel without first merging back to the consumer thread, as would be the case when enumerating a LINQ result using the foreach keyword.
Cancel Task C#
Difference between Synchronous and Asynchronous

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW DOWNLOAD READ ONLINE

Download All Hindi EBooks

सभी हिन्दी EBooks C, C++, Java, C#, ASP.NET, Oracle, Data Structure, VB6, PHP, HTML5, JavaScript, jQuery, WordPress, etc... के DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।