Остановка DispatcherTimer в своем собственном анонимном обработчике событий Tick - PullRequest
6 голосов
/ 22 октября 2011

Безопасно ли делать что-то вроде этого:

private void MyFunction()
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    timer.Tick += (object sender, object e) =>
    {
        timer.Stop();
        // Some code here
    };
    timer.Start();
}

Ответы [ 3 ]

5 голосов
/ 22 октября 2011

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

private void MyFunction()
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    EventHandler eh = null;
    eh = (object sender, object e) =>
    {
        timer.Tick -= eh;
        timer.Stop();
        // Some code here
    };

    timer.Tick += eh;
    timer.Start();
}

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

4 голосов
/ 22 октября 2011

Да. Ваш таймер сработает один раз.

2 голосов
/ 22 октября 2011

Редактировать: я перефразирую свой ответ на основе комментариев. В приведенной вами ситуации, да, совершенно безопасно использовать анонимного делегата.

Существуют некоторые ситуации, в которых добавление анонимного делегата и его отключение может помешать вашему классу собирать мусор (например, присоединение анонимного делегата к одиночному). См. этот ответ для получения информации о том, когда и когда нет необходимости отсоединять обработчик событий.

...