.net - एक अज्ञात प्रतिनिधि के साथ ईवेंट हैंडलिंग



events anonymous-delegates (1)

रिकॉर्ड के लिए: मुझे यहां एक समान प्रश्न मिला है लेकिन मुझे इस विषय पर थोड़ा और विस्तार करना होगा।

मेरी कंक्रीट परिदृश्य यह है:

सिल्वरलाइट 4 में, myFrameworkElement.FindName("otherElementName") विधि अब ठीक काम करती है, लेकिन मुझे एक समस्या का सामना करना पड़ा। यह अभी भी null रिटर्न देता है जब तत्व दृश्य पेड़ को अभी तक जोड़ा नहीं जाता है

लेकिन अब मुझे एक कस्टम UserControl हैंन्डलर के UserControl PropertyChangedCallback के PropertyChangedCallback UserControl में इस कार्यक्षमता की आवश्यकता है I इस दायरे में, यह अनिश्चित है कि उपयोगकर्ता नियंत्रण अभी तक दृश्य पेड़ में जोड़ा गया है। लेकिन मुझे पेड़ में किसी अन्य तत्व पर एक निश्चित क्रिया निष्पादित करनी होगी। जब तत्व पहले ही उपलब्ध है, यह अभी और किया जाना चाहिए यदि नहीं, तो यह तत्काल किया जाना चाहिए जब यह उपलब्ध हो। इसलिए मैं इस एक्सटेंशन विधि के साथ आया हूं जिसे मैं इस तरह से कॉल कर सकता हूं:

myFrameworkElement.FindNameEnsured("otherElementName",
    result => this.DoSomethingWith(result));

विस्तार विधि के लिए कोड इस तरह होता है:

    static public void FindNameEnsured(this FrameworkElement self,
            string name, Action<object> resultAction)
    {
        if (self != null && resultAction != null)
        {
            object result = self.FindName(name);

            if (result != null)
            {
                resultAction(result);
            }
            else
            {
                RoutedEventHandler handler = null;
                handler = (sender, e) =>
                     {
                         result = self.FindName(name);
                         resultAction(result);

                         self.Loaded -= handler;
                     };

                self.Loaded += handler;
            }
        }

जैसा कि आप देख सकते हैं, मुझे एक अज्ञात प्रतिनिधि का उपयोग करना होगा क्योंकि मुझे name और resultAction लिए मूल्यों की जरूरत resultAction अंदर का resultAction । तब मैं हेन्डलर के अंदर की घटना को रद्द कर देता हूं क्योंकि मैं एक स्मार्ट और साफ आदमी हूं और कोई रिसाव नहीं चाहता। मैं भी कुछ फैंसी WeakEventFactories या इसी तरह सामान के साथ यहाँ पहियों पर किसी भी मक्खियों को तोड़ना नहीं चाहता।

अब यह आसानी से अब तक काम करता है। लेकिन मेरे पास कुछ प्रश्न हैं

  1. क्या यह आमतौर पर हेन्डलर के अंदर ईवेंट हैंडलर को समाप्त करने के लिए एक साफ-साफ दृष्टिकोण है? या यह है कि अंत में एक निर्दोष पिल्ला को मारने जा रहा है?
  2. अज्ञात प्रतिनिधियों के अंदर बाहरी गुंजाइश चर का उपयोग करने के कारण कुछ रिसाव जैसे कुछ समस्याएं हो सकती हैं?
  3. वहाँ थ्रेड सिंक्रनाइज़ेशन समस्या हो सकती है जो मुझे Loaded ईवेंट "याद" करने के लिए प्रेरित करेगा? इस विशेष परिदृश्य में, केवल सिल्वरलाइट के यूआई डिस्पैचर थ्रेड में शामिल होना चाहिए। लेकिन अगर यह एक समस्या है, और / या अगर मुझे एक गैर-यूआई संबंधी परिदृश्य में एक समान कार्यक्षमता की आवश्यकता है, तो यह एफ 1x0 आर के लिए सबसे अच्छा तरीका क्या है?

आपके धैर्य के लिए धन्यवाद और समय-समय पर मेरी लंबी व्याख्याएं पढ़ना ;-)


  1. यह ठीक होना चाहिए, हालांकि यह थोड़ा दर्दनाक है LINQ से आरएक्स को सदस्यता समाप्त करने का अच्छा विचार है - जब आप सब्सक्राइब करते हैं, तो आपको एक IDisposable दिया जाता है, जब आप इसका निपटान करते हैं हालांकि यह मौजूदा इवेंट मॉडल में फिट नहीं है।
  2. मुझे नहीं लगता कि इस विशेष मामले में आपके पास कोई रिसाव होगा - कुछ किनारों की स्थितियां हैं जहां एक ही दायरे में वेरिएबल्स का उपयोग करते हुए दो अलग-अलग बेमेल फ़ंक्शंस प्रत्येक वे कैप्चर करने वाले चर को समाप्त कर सकते हैं, जिनकी उन्हें आवश्यकता नहीं है, लेकिन यह वास्तव में एक किनारे है मामला।
  3. आप काल्पनिक स्थिति के बारे में अधिक सटीक विवरण देना होगा - क्या आप वास्तव में चिंतित थे, कैसे इवेंट आदि लागू किया जाता है




anonymous-delegates