Task.GetAwaiter().GetResult()
अधिक पसंद किया जाता है Task.Wait
और Task.Result
क्योंकि यह अपवादों को एक में लपेटने के बजाय प्रचारित करता है AggregateException
। हालांकि, सभी तीन विधियां गतिरोध और थ्रेड पूल भुखमरी के मुद्दों की क्षमता का कारण बनती हैं। इन सबके पक्ष में टाला जाना चाहिए async/await
।
नीचे बोली क्यों बताते हैं Task.Wait
और Task.Result
बस के अपवाद के प्रचार व्यवहार शामिल नहीं है Task.GetAwaiter().GetResult()
(एक "बहुत ही उच्च संगतता बार" के कारण)।
जैसा कि मैंने पहले उल्लेख किया है, हमारे पास एक बहुत ही उच्च संगतता पट्टी है, और इस प्रकार हमने परिवर्तनों को तोड़ने से बचा लिया है। जैसे, Task.Wait
हमेशा लपेटने के अपने मूल व्यवहार को बरकरार रखता है। हालाँकि, आप अपने आप को कुछ उन्नत स्थितियों में पा सकते हैं, जहाँ आप अपने द्वारा नियोजित तुल्यकालिक अवरोधन के समान व्यवहार चाहते हैं Task.Wait
, लेकिन जहाँ आप चाहते हैं कि मूल अपवाद एक में संलग्न होने की बजाय अलिखित प्रचारित हो AggregateException
। इसे प्राप्त करने के लिए, आप सीधे टास्क के वेटर को लक्षित कर सकते हैं। जब आप " await task;
" लिखते हैं , तो संकलक उस Task.GetAwaiter()
विधि के उपयोग में अनुवाद करता है , जो एक उदाहरण देता है जिसमें एक GetResult()
विधि होती है। जब एक दोषपूर्ण कार्य पर उपयोग किया जाता है, GetResult()
तो मूल अपवाद का प्रचार करेगा (यह इस तरह से है " await task;
" अपने व्यवहार को प्राप्त करता है)। आप इस प्रकार उपयोग कर सकते हैं ”task.GetAwaiter().GetResult()
“यदि आप इस प्रचार तर्क को सीधे लागू करना चाहते हैं।
https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/
" GetResult
वास्तव में इसका मतलब है" त्रुटियों के लिए कार्य की जांच करें "
सामान्य तौर पर, मैं एक अतुल्यकालिक कार्य पर तुल्यकालिक रूप से अवरुद्ध होने से बचने की पूरी कोशिश करता हूं। हालाँकि, ऐसी कई परिस्थितियाँ हैं जहाँ मैं उस दिशानिर्देश का उल्लंघन करता हूँ। उन दुर्लभ परिस्थितियों में, मेरा पसंदीदा तरीका है GetAwaiter().GetResult()
क्योंकि यह कार्य अपवादों को एक में लपेटने के बजाय सुरक्षित रखता है AggregateException
।
http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html
GetResult
: "यह प्रकार और इसके सदस्यों को संकलक द्वारा उपयोग करने के लिए अभिप्रेत है।" अन्य व्यक्ति को इसका उपयोग नहीं करना चाहिए।