سؤال

وكيف اقتراح أفضل طريقة لتجنب الاشتراكات الحدث المكررة؟ إذا كان هذا سطر من التعليمات البرمجية ينفذ في مكانين، وسوف تحصل على ركض حدث مرتين. أحاول تجنب الأحداث 3rd الطرف من الاشتراك مرتين.

theOBject.TheEvent += RunMyCode;

في بلدي اضع مندوب، ويمكن تشغيلها على نحو فعال هذا ...

theOBject.TheEvent -= RunMyCode;
theOBject.TheEvent += RunMyCode;

ولكن هو أن أفضل وسيلة؟

هل كانت مفيدة؟

المحلول

وأعتقد أن الطريقة الأكثر فعالية، هو جعل هذا الحدث الخاص بك خاصية وإضافة الأقفال التزامن كما هو الحال في هذا على <وأ href = "http://codinglight.blogspot.com/2009/02/preventing -duplicate-اشتراكات to.html "يختلط =" noreferrer "> مثال : ل

private EventHandler _theEvent;
private object _eventLock = new object();
public event EventHandler TheEvent
{
    add
    {
        lock (_eventLock) 
        { 
            _theEvent -= value; 
            _theEvent += value; 
        }
    }
    remove
    {
        lock (_eventLock) 
        { 
           _theEvent -= value; 
        }
    }
}

نصائح أخرى

ولقد فعلت هذا من قبل .... يفترض أنه من المقبول أن المشترك الأخير هو ما يحصل على استدعاء.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            MyObject my = new MyObject();
            my.Changed += new EventHandler(my_Changed);
            my.Changed += new EventHandler(my_Changed1);

            my.Update();
            Console.ReadLine();
        }

        static void my_Changed(object sender, EventArgs e)
        {
            Console.WriteLine("Hello");
        }
        static void my_Changed1(object sender, EventArgs e)
        {
            Console.WriteLine("Hello1");
        }
    }
    public class MyObject
    {
        public MyObject()
        {
        }
        private EventHandler ChangedEventHandler;
        public event EventHandler Changed
        {
            add
            {
                ChangedEventHandler = value;
            }
            remove
            {
                ChangedEventHandler -= value;
            }
        }
        public void Update()
        {
            OnChanged();
        }

        private void OnChanged()
        {
            if (ChangedEventHandler != null)
            {
                ChangedEventHandler(this, null);
            }
        }
    }
}

هل الخيوط المتعددة التعليمات البرمجية الخاصة بك؟ هناك حاجة إلى تأمين التزامن فقط عندما تعددية مترابطة. إن لم يكن لفي سماء المنطقة.

وعلى هذا النحو نهجكم من إلغاء الاشتراك الاشتراكات و هو الصحيح.

والشكر

إذا كنت تملك مصدر لفئة من theObject، ثم لديك الوصول إلى InvocationList من TheEvent. يمكنك تطبيق الخاص بك استرجاع إضافة الخاصة لهذا الحدث وتحقق قبل أن يضيف.

ومع ذلك، أعتقد أن نهجكم على ما يرام أيضا.

وأنا استخدم نهجكم باستثناء واحد من التفصيل. أعتقد أن الأحداث يجب أن تكون مشترك عند إنشاء مثيل جديد من المشترك أو theObject، وهذا يجعل رمز أكثر مباشرة. وهكذا، كل ما عليك القيام به هو مجرد مشاهدة بعناية بعد الأشياء الصحيحة التخلص (التخلص باتن هو حل مناسب لهذا).

وأنت ذكرت أنك تستخدم الحدث 3rd الطرف، وهذا يعني أنه لا يمكن أن توفر الإدراك الخاصة بك لإضافة / إزالة الأساليب، كما كنت قد نصحت. ولكن في الطبقات الخاصة بك مع الأحداث الخاصة بك يجب أن تحدد تحقيق الخاصة بك من إضافة / إزالة طرق لهذا الحدث من أجل حل مشكلتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top