.net - Two questions on ensuring EndInvoke() gets called on a list of IAsyncResult objects -


तो यह प्रश्न। नेट IAsyncResult डिजाइन पैटर्न और EndInvoke को कॉल करने की आवश्यकता के संबंध में है प्रश्न में

पृष्ठभूमि

मेरे पास कुछ कोड है जहां मैं संभावित रूप से कई असिंक्रोनस कॉल को किसी विशेष फ़ंक्शन से बंद कर रहा हूं और फिर इन सभी कॉल्स की प्रतीक्षा कर रहा हूं

प्रश्न 1

मुझे नहीं पता है कि क्या कोई भी परिणाम वापस पाने के लिए endInvoke () का उपयोग करने से पहले समाप्त करें। जब तक मैं EndInvoke () को कॉल करता हूं और कॉल में से किसी एक कॉल में कोई अपवाद उत्पन्न होता है, तब तक कॉल में अपवाद का सामना करना पड़ता है और अपवाद एक एपीआई विशिष्ट अपवाद में लिपटा जाता है और फेंका जाता है ऊपर की ओर।

तो मेरा पहला प्रश्न यह है कि यह सुनिश्चित करने के लिए सबसे अच्छा तरीका क्या है कि एसिंक कॉल का शेष भाग ठीक ढंग से समाप्त हो गया?

क्या अंततः ब्लॉक है जो एंडइवोक () पर रहने वाले पर कॉल करता है आरम्भ किए गए कॉल्स (और आगे के अपवादों को अनदेखा करने) का सबसे अच्छा तरीका यह है?

प्रश्न 2

दूसरे, जब मैं पहली बार सभी को बंद करता हूं एएससीसी कॉल मैं फिर कॉल करें <> कोड> प्रतीक्षाहाण्डल। सभी () पर होरहेल के सरणी पर कॉल करें जो मेरे IAsyncResult के उदाहरणों से मिलते हैं I ये सभी एएसआईएनसी कॉल्स फायरिंग करने वाली विधि का पालन करने का एक समय समाप्त हो गया है, इसलिए मैं इसे WaitAll () पद्धति के लिए प्रदान करता हूं। फिर मैं जांचता हूं कि सभी कॉल पूर्ण हैं या नहीं, यदि नहीं तो समय समाप्ति तक पहुंचने चाहिए ताकि विधि को भी विफल हो और अन्य एपीआई विशिष्ट अपवाद फेंक दें।

तो मेरा दूसरा प्रश्न यह है कि मुझे इस पर क्या करना चाहिए मामला?

मैं त्रुटि को फेंकने से पहले इन सभी एएसआईएनसी कॉल को समाप्त करने के लिए EndInvoke () कॉल करने की आवश्यकता है, लेकिन उसी समय मैं कोड नहीं रोकना चाहता क्योंकि एंडइन्वेक () ब्लॉक कर रहा है सिद्धांत में कम से कम यदि WaitAll () कॉल बार बाहर होता है तो सभी एएससीएनसी कॉलों को स्वयं का समय समाप्त हो जाना चाहिए और अपवादों को फेंक दिया जाता है (इस प्रकार कॉल को पूरा करना) क्योंकि वे समय-समय पर शासित होते हैं लेकिन यह समय समाप्त हो जाता है मुख्य समयबाह्य से संभावित भिन्न

मैं अपने IAsyncResult ऑब्जेक्ट के जरिए पुनरावृत्त होगा, प्रत्येक एंडइवोक को एक प्रयास / पकड़ में लपेटकर किसी भी अन्य अपवाद को किसी अन्य स्थान पर संग्रहीत करता है उसके बाद, जब आपने सभी EndInvoke s को बुलाया है, तो आप देख सकते हैं कि आपने किसी भी अपवाद को संग्रहित किया है और एक API अपवाद फेंक दिया है यदि ऐसा है। ऐसा कुछ:

  var exs = नई सूची & lt; अपवाद & gt; (); विदेशी (IAsyncResult iasr asyncResults में) {try {iasr.EndInvoke ()} } पकड़ (अपवाद ई) {exs.Add (e); }} यदि (exs.Count & gt; 0) {नया माइएक्सेशन (exs.ToReadOnly ()); }  

Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -