Выяснил гораздо более простой метод.
User.first [: first_name] = "Джон"
Я думаю, что наиболее эффективный способ - сделать ваше событие свойством и добавьте к нему блокировки параллелизма, как в этом примере :
private EventHandler _theEvent;
private object _eventLock = new object();
public event EventHandler TheEvent
{
add
{
lock (_eventLock)
{
_theEvent -= value;
_theEvent += value;
}
}
remove
{
lock (_eventLock)
{
_theEvent -= value;
}
}
}
Я использую ваш подход, за исключением одной детали. Я думаю, что события должны быть подписаны при создании нового экземпляра подписчика или theObject, это делает код более прямым. Таким образом, все, что вам нужно, это просто внимательно следить за правильной утилизацией объектов (для этого удобно использовать утилиту patten).
Вы упомянули, что используете стороннее событие, что означает, что вы не можете предоставить собственную реализацию для добавления / удаления. методы, как вам советовали. Но в ваших собственных классах с вашими собственными событиями вы должны определить собственную реализацию методов добавления / удаления для события, чтобы решить вашу проблему.
Ваш код многопоточный? Блокировка параллелизма необходима только тогда, когда она многопоточная. Если это не накладные расходы.
Таким образом, ваш подход отказа от подписки и подписки является правильным.
Спасибо
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);
}
}
}
}
Если вы владеете источником для класса theObject, тогда у вас есть доступ к InvocationList из TheEvent. Вы можете реализовать собственный метод доступа для события и проверить его перед добавлением.
Однако,