Task.WaitAll - वर्तमान थ्रेड को तब तक ब्लॉक करता है जब तक सभी अन्य टास्क निष्पादन पूरा नहीं कर लेते।
Task.WhenAll - एक टास्क बनाता है जो तभी पूरा होगा जब अन्य सभी टास्क पूरे हो जाएंगे। यह निष्पादन को ब्लॉक नहीं करता - यह एक टास्क लौटाता है जिसे अवेट किया जा सकता है।
उदाहरण 1: Task.WhenAll (नॉन-ब्लॉकिंग)
static async Task Main(string[] args)
{
Task task1 = Task.Run(() =>
{
for (var i = 0; i < 5; i++)
{
Console.WriteLine("Task 1 - iteration {0}", i);
await Task.Delay(1000); // async delay
}
Console.WriteLine("Task 1 complete");
});
Task task2 = Task.Run(() =>
{
for (var i = 0; i < 5; i++)
{
Console.WriteLine("Task 2 - iteration {0}", i);
await Task.Delay(1000);
}
Console.WriteLine("Task 2 complete");
});
Console.WriteLine("Waiting for tasks to complete.");
await Task.WhenAll(task1, task2); // नॉन-ब्लॉकिंग अवेट
Console.WriteLine("Both Tasks Completed.");
Console.ReadLine();
}
आउटपुट (WhenAll - नॉन-ब्लॉकिंग)
Waiting for tasks to complete.
Both Tasks Completed. <-- तुरंत प्रिंट होता है (ब्लॉक नहीं करता)
Task 1 - iteration 0
Task 2 - iteration 0
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 4
Task 2 complete
उदाहरण 2: Task.WaitAll (ब्लॉकिंग)
static void Main(string[] args)
{
Task task1 = Task.Run(() =>
{
for (var i = 0; i < 5; i++)
{
Console.WriteLine("Task 1 - iteration {0}", i);
Task.Delay(1000).Wait(); // सिंक्रोनस वेट
}
Console.WriteLine("Task 1 complete");
});
Task task2 = Task.Run(() =>
{
for (var i = 0; i < 5; i++)
{
Console.WriteLine("Task 2 - iteration {0}", i);
Task.Delay(1000).Wait();
}
Console.WriteLine("Task 2 complete");
});
task1.Start();
task2.Start();
Console.WriteLine("Waiting for tasks to complete.");
Task.WaitAll(task1, task2); // करंट थ्रेड को ब्लॉक करता है
Console.WriteLine("Both Tasks Completed."); // सभी टास्क पूरे होने के बाद प्रिंट होता है
Console.ReadLine();
}
आउटपुट (WaitAll - ब्लॉकिंग)
Waiting for tasks to complete.
Task 1 - iteration 0
Task 2 - iteration 0
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 2 - iteration 4
Task 2 complete
Both Tasks Completed. <-- अंत में प्रिंट होता है (ब्लॉक करता है)
तुलना तालिका
| विशेषता | Task.WhenAll | Task.WaitAll |
|---|---|---|
| ब्लॉकिंग | नहीं (टास्क लौटाता है) | हाँ (थ्रेड ब्लॉक करता है) |
| रिटर्न टाइप | Task | void |
| उपयोग | async/await के साथ | सिंक्रोनस कोड में |
| डेडलॉक जोखिम | कम | उच्च (UI थ्रेड में) |
| एक्सेप्शन हैंडलिंग | await के साथ try/catch | try/catch में AggregateException |
सर्वोत्तम अभ्यास
- ASP.NET Core / UI एप्लिकेशन में Task.WhenAll + await का उपयोग करें
- कंसोल एप्लिकेशन के Main में Task.WaitAll स्वीकार्य है
Task.Runका उपयोग करके टास्क्स शुरू करें,new Task(...).Start()के बजाय- हमेशा
Task.Delayके साथawaitका उपयोग करें,.Wait()के बजाय