2009-07-07 5 views
1

Можно создать дубликат:
How to ensure an event is only subscribed to onceкак убедиться, что существует ровно один обработчик событий в C#

Иногда я хочу, чтобы присоединить обработчик событий, но я не уверен, если я вы сделали это уже к этому объекту. Мое обходное решение состоит в том, чтобы удалить его, используя - = затем добавить его, используя + =. Есть ли способ лучше?

Edit: Причина, я хочу, чтобы убедиться, что не сделать это дважды (или больше), что если я делаю, это уволят в два раза (или больше)

+7

Мой совет: обязательно. Почему вы находитесь в ситуации, когда вы не знаете состояние своей собственной программы? –

+2

Не поймите меня неправильно, но у вас есть большая проблема в вашей руке, чем в том, что есть только один обработчик событий. Я имею в виду, если это ваш собственный код, как бы вы не знали, что уже добавили обработчик событий? – SolutionYogi

+0

Ну, Эрик избил меня. :) – SolutionYogi

ответ

1

Решение удаления события, а затем добавить он может взорваться в многопоточном сценарии, где вы можете эффективно либо добавить дубликаты, либо исключить из него.

Вы можете реализовать add and remove на своем мероприятии, но это связано с его собственными оговорками.

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

0

вы попробуете это ли:

public event MyClickHandler Click = delegate {}; // add empty delegate! 

Подробнее фотография: Hidden Features of C#?

0

Итак, я предполагаю, что вы не в состоянии контролировать класс, который вызывает событие, и вы не можете проверить его там , Если вам нужна проверка времени выполнения, независимо от того, зарегистрирована ли вы только для события на стороне приемника, вы можете централизовать свою регистрацию в методе, который проверяет, что вы уже зарегистрировались, что-то вроде ...

private void RegisterForEvent() 
{ 
    lock(_registerLock) 
    { 
    if(!_iveDoneThisAlready) 
    { 
     _iveDoneThisAlready = true; 
     // register for Event here 
    } 
    } 
} 

Но ваш код должен согласиться с этим соглашением. Нет ничего, что заставляло бы регистратора называть этот метод вместо + =.

Смежные вопросы