मैंने देखा है Parallel.ForEach को अनुचित तरीके से इस्तेमाल किया गया है, और मुझे लगा कि इस प्रश्न में एक उदाहरण से मदद मिलेगी।
जब आप नीचे एक कंसोल ऐप में कोड चलाते हैं, तो आप देखेंगे कि Parallel.ForEach में निष्पादित कार्य कैसे कॉलिंग थ्रेड को ब्लॉक नहीं करते हैं। यदि आप परिणाम (सकारात्मक या नकारात्मक) की परवाह नहीं करते हैं तो यह ठीक हो सकता है लेकिन यदि आपको परिणाम की आवश्यकता है, तो आपको Task.WhenAll का उपयोग करना सुनिश्चित करना चाहिए।
using System;
using System.Linq;
using System.Threading.Tasks;
namespace ParrellelEachExample
{
class Program
{
static void Main(string[] args)
{
var indexes = new int[] { 1, 2, 3 };
RunExample((prefix) => Parallel.ForEach(indexes, (i) => DoSomethingAsync(i, prefix)),
"Parallel.Foreach");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("*You'll notice the tasks haven't run yet, because the main thread was not blocked*");
Console.WriteLine("Press any key to start the next example...");
Console.ReadKey();
RunExample((prefix) => Task.WhenAll(indexes.Select(i => DoSomethingAsync(i, prefix)).ToArray()).Wait(),
"Task.WhenAll");
Console.WriteLine("All tasks are done. Press any key to close...");
Console.ReadKey();
}
static void RunExample(Action<string> action, string prefix)
{
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"{Environment.NewLine}Starting '{prefix}'...");
action(prefix);
Console.WriteLine($"{Environment.NewLine}Finished '{prefix}'{Environment.NewLine}");
}
static async Task DoSomethingAsync(int i, string prefix)
{
await Task.Delay(i * 1000);
Console.WriteLine($"Finished: {prefix}[{i}]");
}
}
}
यहाँ परिणाम है:
निष्कर्ष:
Parallel.ForEach का उपयोग टास्क के साथ करने से कॉलिंग थ्रेड ब्लॉक नहीं होगा। यदि आप परिणाम की परवाह करते हैं, तो कार्यों का इंतजार करना सुनिश्चित करें।
~ चीयर्स
Task.WaitAll
इसके बजाय उपयोग करते हैंTask.WhenAll
।