2015-12-31 9 views
11

मैं अपने प्रोजेक्ट में से एक के लिए सबसे अच्छा अभ्यास खोजने की कोशिश कर रहा हूँ। यह एक यूआई के साथ एक ठेठ डब्ल्यूपीएफ एप्लीकेशन है जो वस्तुओं की एक सूची प्रदर्शित करता है और एक डेटा सेवा है जो परिणाम देता है।Async बनाम GetAwaiter() का इंतजार है। GetResult() और कॉलबैक

हम इतनी के रूप में यूआई ब्लॉक नहीं करने के लिए सेवा बुला रहे हैं अतुल्यकालिक रूप से। हम 2 हमारे सामने विकल्प हैं:

  1. Async का उपयोग का इंतजार कीवर्ड यह बटन से सभी तरीकों Async अंकन की आवश्यकता है सेवा के लिए परत सभी तरह क्लिक करें (क्लाइंट की तरफ वर्ग सर्वर से http कॉल करता है कि) और बीच में कोई भी विधि। यह दृष्टिकोण ठीक अन्य काम करता है तो हर जगह async प्रचार के मुद्दे

  2. awaiter और कॉलबैक इस दृष्टिकोण यूआई ग्राहक सेवा परत कॉल करता है और सेवा परत को एक कॉलबैक गुजरता में प्रयोग करें, सेवा परत http कॉल करने के लिए लपेटता एक कार्य में सर्वर और GetAwaiter()। GetResult() का उपयोग करें, जब http कॉल समाप्त हो जाता है तो यह UI क्लाइंट द्वारा पारित कॉलबैक को आमंत्रित करता है। इस मामले में कोई विधि एसिंक को चिह्नित नहीं करनी है, लेकिन GetAwaiter()

    टास्क.रुन (async() => // http कॉल का इंतजार, कॉलबैक का आह्वान) के बारे में वास्तव में निश्चित नहीं है। GetAwaiter()। GetResult ();

मैं सिर्फ पता लगाने के लिए जो एक बेहतर तरीका है और कोशिश कर रहा हूँ अगर वहाँ है कि मैं

+1

मुझे पूरा यकीन है कि दूसरा दृष्टिकोण थोड़ी देर में मृत ताले का कारण बन सकता है। मुझे पता है क्योंकि विंडोज यूनिवर्सल के साथ विकास करते समय मुझे कुछ समान सामना करना पड़ा है। – Felype

+0

अपवादों का सवाल भी है। मैं एक पूर्ण async कार्यान्वयन के साथ पता है, तुम अंत में 'AggregateException' मिलता है, लेकिन मुझे नहीं पता कि क्या' GetAwaiter' विधि – Eris

+0

@Eris में अपवाद के लिए होता जब आप का इंतजार है आप एक 'AggregateException' नहीं मिलता है। आपको आंतरिक अपवाद मिलता है। 'GetResult' के साथ भी ऐसा ही होता है। – i3arnon

उत्तर

16

के बारे में पता आप async और await कीवर्ड नीचे से ऊपर तक का उपयोग करना चाहिए होना चाहिए या तो दृष्टिकोण के साथ कुछ मुद्दों कर रहे हैं , या आपको एसिंक का बिल्कुल उपयोग नहीं करना चाहिए।

आपका दूसरा विकल्प वास्तव में अतुल्यकालिक नहीं है। यह एसिंक्रोनस ऑपरेशन को कॉल कर रहा है और task.GetAwaiter().GetResult() के साथ सिंक्रनाइज़ रूप से अवरुद्ध कर रहा है। बहुत जटिल होने के शीर्ष पर यह असीमित नहीं है और इससे डेडलॉक्स हो सकते हैं।

+0

क्या आपके पास कुछ और पृष्ठभूमि जानकारी है कि यह डेडलॉक्स क्यों हो सकता है? मैंने यह भी अनुभव किया है, लेकिन मैं कुछ और गहराई से जानकारी ढूंढ रहा हूं कि यह क्यों होता है या यह कैसे काम करता है। –

+2

@FrederikGheysels http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html – i3arnon

+0

, महान सलाह की तरह लगता है, सिवाय मैं Azure सक्रिय निर्देशिका (TokenCache) से इस API के साथ अटक कर रहा हूँ जो तुल्यकालिक संचालन की आवश्यकता है। जब तक आप कैश नहीं पढ़ लेते हैं तब तक आप 'PreAccessNotification' से वापस नहीं आ सकते हैं और जब तक आप कैश नहीं लिख लेते हैं तब तक आप 'AfterAccessNotification' से वापस नहीं आ सकते। जब आपको सिंक्रॉइस एपीआई में मजबूर किया जाता है और फ़ाइल तक पहुंचने की आवश्यकता होती है तो आपकी सलाह क्या होती है? –

संबंधित मुद्दे