Избежание многократных подписок, либо гарантированная отписка от всех C#

void MayBeInvokesOneOrMoreTimes()
{
SomeAction+=Subs;
}

void Subs()
{

}

void Clear()
{
SomeAction-=Subs;
}

При таком коде, в случае вызова метода MayBeInvokesOneOrMoreTimes несколько раз, происходит многократная подписка, и метод Clear в таком случае снимет всего одну подписку, а остальные будут работать.

Вопрос - как выйти из этой ситуации? Я вижу три варианта

1)Не использовать метод, который вызывается более одного раза, для подписки.

2)Использовать bool для проверки - подписывался ли я уже, и если да, то второй раз этого не делать.

3)Использовать какие то встроенные методы C#, которые расчитаны на это, возможно где то есть возможность "удалять все подписки, вызывающие этот метод у этого эвента"

Вопрос - есть ли что-то такое в шарпе из 3-го варианта, и как вообще принято решать подобные задачи.


Ответы (1 шт):

Автор решения: Pavel Popov

Можно предварительно отписать обработчик, перед тем как подпиcаться. Ничего страшного, если обработчик перед этим не был подписан. Но вы тем самым гарантируете однократное подписывание (конечно же именно в этом методе)

void MayBeInvokesOneOrMoreTimes() 
{ 
     SomeAction-=Subs;
     SomeAction+=Subs;
}
→ Ссылка