Как убедиться, что к событию не прикреплены обработчики? - PullRequest
0 голосов
/ 19 марта 2010

Я добавляю обработчик событий , например:

theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);

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

if(theImage.MouseMove == null) //error
    theImage.MouseMove += new MouseEventHandler(theImage_MouseMove);

Ответы [ 4 ]

1 голос
/ 19 марта 2010

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

Если вы делаете что-то вроде:

TheImage.MouseMove -= new MouseEventHandler(theImage_MouseMove);
TheImage.MouseMove += new MouseEventHandler(theImage_MouseMove);

Он будет добавлен только один раз.Если он еще не существует (при первом запуске), - = ничего не повредит, если он не был подписан ранее.

1 голос
/ 19 марта 2010

Вы можете сократить его, если хотите присоединить только один раз:

theImage.MouseMove -= theImage_MouseMove; //If it wasn't attached, doesn't matter
theImage.MouseMove += theImage_MouseMove;
1 голос
/ 19 марта 2010

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

public static void Main(string[] args)
{
    var timer = new Timer(1000);

    timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
    timer.Elapsed -= new ElapsedEventHandler(timer_Elapsed);
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);

    timer.Start();

    System.Threading.Thread.Sleep(4000);
}

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Console.WriteLine("Hit!");
}

Обработчик будет запускаться только раз в секунду.

0 голосов
/ 19 марта 2010
theImage.MouseMove.GetInvocationList().Length
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...