Async CTP से Task.WaitAll()
और क्या अंतर है Task.WhenAll()
? क्या आप विभिन्न उपयोग के मामलों का वर्णन करने के लिए कुछ नमूना कोड प्रदान कर सकते हैं?
Async CTP से Task.WaitAll()
और क्या अंतर है Task.WhenAll()
? क्या आप विभिन्न उपयोग के मामलों का वर्णन करने के लिए कुछ नमूना कोड प्रदान कर सकते हैं?
जवाबों:
Task.WaitAll
सब कुछ पूरा होने तक वर्तमान धागे को अवरुद्ध करता है।
Task.WhenAll
एक कार्य देता है जो सब कुछ पूरा होने तक प्रतीक्षा की कार्रवाई का प्रतिनिधित्व करता है।
इसका मतलब है कि एक async विधि से, आप उपयोग कर सकते हैं:
await Task.WhenAll(tasks);
... जिसका अर्थ है कि आपका तरीका तब तक जारी रहेगा जब सब कुछ पूरा हो जाएगा, लेकिन आप उस समय तक घूमने के लिए एक धागा नहीं बांधेंगे।
WhenAll
, लेकिन यह धागे को अवरुद्ध करने के समान नहीं है।
जबकि जॉनस्केट का जवाब आम तौर पर उत्कृष्ट तरीके से अंतर को बताता है: एक और अंतर है: अपवाद हैंडलिंग ।
Task.WaitAll
एक फेंकता है AggregateException
जब कार्यों के किसी भी फेंकता है और आप सभी फेंका अपवाद की जांच कर सकते हैं। await
में await Task.WhenAll
unwraps AggregateException
और 'रिटर्न' केवल प्रथम अपवाद।
जब नीचे दिए गए प्रोग्राम await Task.WhenAll(taskArray)
आउटपुट के साथ निष्पादित होता है।
19/11/2016 12:18:37 AM: Task 1 started
19/11/2016 12:18:37 AM: Task 3 started
19/11/2016 12:18:37 AM: Task 2 started
Caught Exception in Main at 19/11/2016 12:18:40 AM: Task 1 throwing at 19/11/2016 12:18:38 AM
Done.
जब Task.WaitAll(taskArray)
आउटपुट के साथ नीचे दिए गए प्रोग्राम को निष्पादित किया जाता है।
19/11/2016 12:19:29 AM: Task 1 started
19/11/2016 12:19:29 AM: Task 2 started
19/11/2016 12:19:29 AM: Task 3 started
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 1 throwing at 19/11/2016 12:19:30 AM
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 2 throwing at 19/11/2016 12:19:31 AM
Caught AggregateException in Main at 19/11/2016 12:19:32 AM: Task 3 throwing at 19/11/2016 12:19:32 AM
Done.
कार्यक्रम:
class MyAmazingProgram
{
public class CustomException : Exception
{
public CustomException(String message) : base(message)
{ }
}
static void WaitAndThrow(int id, int waitInMs)
{
Console.WriteLine($"{DateTime.UtcNow}: Task {id} started");
Thread.Sleep(waitInMs);
throw new CustomException($"Task {id} throwing at {DateTime.UtcNow}");
}
static void Main(string[] args)
{
Task.Run(async () =>
{
await MyAmazingMethodAsync();
}).Wait();
}
static async Task MyAmazingMethodAsync()
{
try
{
Task[] taskArray = { Task.Factory.StartNew(() => WaitAndThrow(1, 1000)),
Task.Factory.StartNew(() => WaitAndThrow(2, 2000)),
Task.Factory.StartNew(() => WaitAndThrow(3, 3000)) };
Task.WaitAll(taskArray);
//await Task.WhenAll(taskArray);
Console.WriteLine("This isn't going to happen");
}
catch (AggregateException ex)
{
foreach (var inner in ex.InnerExceptions)
{
Console.WriteLine($"Caught AggregateException in Main at {DateTime.UtcNow}: " + inner.Message);
}
}
catch (Exception ex)
{
Console.WriteLine($"Caught Exception in Main at {DateTime.UtcNow}: " + ex.Message);
}
Console.WriteLine("Done.");
Console.ReadLine();
}
}
await t1; await t2; await t3;
बनामawait Task.WhenAll(t1,t2,t3);
await
, न कि दो तरीकों के बीच का अंतर। दोनों एक प्रचार करते हैं AggregateException
, या तो सीधे या एक संपत्ति ( Task.Exception
संपत्ति) के माध्यम से फेंकते हैं।
अंतर के एक उदाहरण के रूप में - यदि आपके पास कोई कार्य UI थ्रेड के साथ कुछ करता है (उदाहरण के लिए एक कार्य जो कि स्टोरीबोर्ड में एक एनीमेशन का प्रतिनिधित्व करता है) तो यदि आप Task.WaitAll()
यूआई धागा अवरुद्ध है और यूआई कभी अपडेट नहीं किया जाता है। यदि आप उपयोग करते हैं await Task.WhenAll()
तो UI थ्रेड ब्लॉक नहीं किया जाता है, और UI अपडेट किया जाएगा।
वो क्या करते हैं:
क्या फर्क पड़ता है:
जब उपयोग करें:
WaitAll
जैसा कि मैं इसे समझता हूं, आपके पास वह संभावना नहीं है ।
Task.WaitAll
बाद सिर्फ कॉल को अलग नहीं किया? मेरा मतलब है, अपने कार्यों को शुरू करने के बाद इसे सही कहने के बजाय।