আমি প্যারালাল দেখেছি Forএকটি অনুপযুক্তভাবে ব্যবহার করা হয়েছে, এবং আমি এই প্রশ্নে একটি উদাহরণ পেয়েছি যা সাহায্য করবে।
আপনি যখন কনসোল অ্যাপে নীচের কোডটি চালাবেন, আপনি দেখতে পাবেন কীভাবে সমান্তরালে কার্য সম্পাদিত হয়েছে Forফোরাচ কলিং থ্রেডটি ব্লক করে না। আপনি যদি ফলাফলটি (ইতিবাচক বা নেতিবাচক) সম্পর্কে চিন্তা না করেন তবে এটি ঠিক হতে পারে তবে যদি আপনার ফলাফলের প্রয়োজন হয় তবে আপনার অবশ্যই টাস্ক.ভেনআল ব্যবহার করা উচিত।
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}]");
}
}
}
ফলাফল এখানে:
উপসংহার:
টাস্ক সহ প্যারালাল.ফোরএচ ব্যবহার করা কলিং থ্রেডকে ব্লক করবে না। আপনি যদি ফলাফলটি সম্পর্কে যত্নশীল হন তবে কাজগুলি অপেক্ষা করতে ভুলবেন না।
~ চিয়ার্স
Task.WaitAll
পরিবর্তে ব্যবহার করেন তবে 2 য় কোড টুকরা 1 ম এর সমান হবেTask.WhenAll
।