Если вы говорите о событии в классе, к которому у вас есть доступ к источнику, вы можете поместить охрану в определение события.
private bool _eventHasSubscribers = false;
private EventHandler<MyDelegateType> _myEvent;
public event EventHandler<MyDelegateType> MyEvent
{
add
{
if (_myEvent == null)
{
_myEvent += value;
}
}
remove
{
_myEvent -= value;
}
}
Это гарантирует, что только один подписчик может подписаться на событие в этом экземпляре класса, предоставляющего событие.
РЕДАКТИРОВАТЬ см. Комментарии о том, почему приведенный выше код является плохой идеей и не безопасен для потоков.
Если ваша проблема в том, что один экземпляр клиента подписывается более одного раза (и вам нужно несколько подписчиков), то клиентский код должен будет обработать это. Так что замени
еще не подписан
с членом bool класса клиента, который устанавливается при первой подписке на событие.
Редактировать (после принятия): На основании комментария от @Glen T (отправитель вопроса) код для принятого решения, с которым он пошел, находится в классе клиента:
if (alreadySubscribedFlag)
{
member.Event += new MemeberClass.Delegate(handler);
}
ГдеreadySubscribeedFlag - это переменная-член в клиентском классе, которая отслеживает первую подписку на конкретное событие.
Люди, просматривающие здесь первый фрагмент кода, примите к сведению комментарий @Rune - не очень хорошая идея изменить поведение подписки на событие неочевидным способом.
РЕДАКТИРОВАТЬ 31/7/2009: Пожалуйста, смотрите комментарии @Sam Saffron. Как я уже говорил, и Сэм согласен, что первый метод, представленный здесь, не является разумным способом изменить поведение подписки на событие. Потребители класса должны знать о его внутренней реализации, чтобы понять его поведение. Не очень приятно.
@Sam Saffron также комментирует безопасность потоков. Я предполагаю, что он имеет в виду возможное состояние гонки, когда два подписчика (близкие к) одновременно пытаются подписаться, и они оба могут в конечном итоге подписаться. Замок может быть использован для улучшения этого. Если вы планируете изменить способ подписки на события, то я советую вам прочитать о том, как сделать подписку добавлением / удалением свойств безопасной для потока .