.net - التعامل مع الحدث مع مندوب مجهول



events anonymous-delegates (1)

  1. هذا ينبغي أن يكون على ما يرام، على الرغم من انها مؤلمة بعض الشيء. لينق ل ر لديه فكرة أجمل من إلغاء الاشتراك - عند الاشتراك، يتم منحك IDisposable الذي يرفض عند التخلص منه. وهذا لا يناسب نموذج الحدث القائم على الرغم من.
  2. لا أعتقد أنه سيكون لديك أي تسرب في هذه الحالة بالذات - هناك بعض ظروف الحافة حيث يمكن لوظيفتين مجهولتين مختلفتين باستخدام متغيرات في النطاق نفسه أن ينتهي كل منهما إلى التقاط المتغيرات التي لا تتطلبها، ولكنها حقا ميزة قضية.
  3. عليك أن تعطي تفاصيل أكثر دقة عن الوضع الافتراضي - ما كنت قلقا بشأن بالضبط، وكيف يتم تنفيذ الحدث الخ.

للسجل: لقد وجدت سؤالا مماثلا هنا ولكن يجب أن أتحدث أكثر قليلا حول هذا الموضوع.

وسيناريو الحقيقي هو:

في myFrameworkElement.FindName("otherElementName") 4، يبدو أن الأسلوب myFrameworkElement.FindName("otherElementName") يعمل بشكل جيد الآن، ولكن واجهت مشكلة. لا تزال تعاد null عندما لم تتم إضافة العنصر إلى شجرة بصرية بشكل واضح.

ولكن الآن أنا بحاجة إلى هذه الوظيفة في DependencyProperty UserControl معالج UserControl مخصصة. في هذا النطاق، فمن غير المؤكد إذا تمت إضافة وسيركونترول إلى شجرة بصرية بعد. ولكن لا بد لي من تنفيذ إجراء معين على عنصر آخر في الشجرة. عندما يكون العنصر متوفرا بالفعل، فإنه يمكن ويجب القيام به الآن. إن لم يكن، يجب أن يتم ذلك فورا عندما يكون متوفرا. لذلك جئت مع هذا الأسلوب التمديد التي يمكنني استدعاء مثل هذا:

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 داخل المعالج. ثم اذهب إلغاء الاشتراك في الحدث داخل معالج لأنني رجل ذكي ونظيف وتريد أي تسرب. أنا أيضا لا تريد كسر أي الذباب على عجلات هنا مع بعض يتوهم ويكيفنتفاكتوريز أو أشياء مماثلة.

الآن يعمل هذا بسلاسة حتى الآن. ولكن لدي بعض الأسئلة.

  1. هل هذا عموما نهج كاف بما فيه الكفاية لإلغاء الاشتراك في معالج الحدث داخل المعالج؟ أو هو أن الذهاب لقتل جرو الأبرياء في نهاية المطاف؟
  2. هل يمكن أن يكون هناك بعض القضايا مثل بعض التسرب بسبب استخدام متغيرات النطاق الخارجي داخل مندوب مجهول؟
  3. هل يمكن أن يكون هناك قضايا تزامن موضوع التي من شأنها أن تسبب لي أن "تفوت" الحدث Loaded ؟ في هذا السيناريو الخاص، يجب أن تشارك فقط موضوع سيلفرليت أوي مرسل. ولكن إذا كان مشكلة على أي حال، و / أو إذا كنت بحاجة إلى وظيفة مماثلة في سيناريو غير المتعلقة واجهة المستخدم، ما هو أفضل نهج ل f1x0r ذلك؟

شكرا بالفعل على صبركم والوقت قراءة بلدي تطورات طويلة. ؛-)





anonymous-delegates