Избегайте дублирующихся подписок события в C#

Выяснил гораздо более простой метод.

User.first [: first_name] = "Джон"

19
задан ScottCate 3 May 2009 в 17:51
поделиться

5 ответов

Я думаю, что наиболее эффективный способ - сделать ваше событие свойством и добавьте к нему блокировки параллелизма, как в этом примере :

private EventHandler _theEvent;
private object _eventLock = new object();
public event EventHandler TheEvent
{
    add
    {
        lock (_eventLock) 
        { 
            _theEvent -= value; 
            _theEvent += value; 
        }
    }
    remove
    {
        lock (_eventLock) 
        { 
           _theEvent -= value; 
        }
    }
}
20
ответ дан 30 November 2019 в 04:16
поделиться

Я использую ваш подход, за исключением одной детали. Я думаю, что события должны быть подписаны при создании нового экземпляра подписчика или theObject, это делает код более прямым. Таким образом, все, что вам нужно, это просто внимательно следить за правильной утилизацией объектов (для этого удобно использовать утилиту patten).

Вы упомянули, что используете стороннее событие, что означает, что вы не можете предоставить собственную реализацию для добавления / удаления. методы, как вам советовали. Но в ваших собственных классах с вашими собственными событиями вы должны определить собственную реализацию методов добавления / удаления для события, чтобы решить вашу проблему.

0
ответ дан 30 November 2019 в 04:16
поделиться

Ваш код многопоточный? Блокировка параллелизма необходима только тогда, когда она многопоточная. Если это не накладные расходы.

Таким образом, ваш подход отказа от подписки и подписки является правильным.

Спасибо

2
ответ дан 30 November 2019 в 04:16
поделиться

I have done this before....it assumes it is acceptable that the last subscriber is what gets called.

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);
            }
        }
    }
}
5
ответ дан 30 November 2019 в 04:16
поделиться

Если вы владеете источником для класса theObject, тогда у вас есть доступ к InvocationList из TheEvent. Вы можете реализовать собственный метод доступа для события и проверить его перед добавлением.

Однако,

1
ответ дан 30 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: