Threading.Timer не работает в моем приложении Modern UI

Я пытаюсь создать таймер для своего современного приложения пользовательского интерфейса C#/Xaml (Windows 8.1).

Я уже видел этот пост: Как мы устанавливаем таймеры в приложении WinRT? Решение, приведенное в этой ссылке, работает для меня. DispatcherTimer работает нормально.

Но моя проблема не там. Я не понимаю, почему это решение не работает:

Мой код:

//First Try
        System.Threading.AutoResetEvent autoEvent = new System.Threading.AutoResetEvent(false);
        StatusChecker statusChecker = new StatusChecker(MyList);
        System.Threading.TimerCallback tcb = statusChecker.CheckStatus;
        //System.Threading.Timer myTimer = new System.Threading.Timer(tcb, autoEvent, 0, 5000);
        System.Threading.Timer theTimer = new System.Threading.Timer(CheckStatus, autoEvent, 0, 5000);    

Я поместил его в конструктор MainPage. TimerTick запускает CheckStatus, который запускает Debug.WriteLine().

Я полагал, что Threading.Timer будет установлен в другом потоке, чем поток пользовательского интерфейса, но когда я нажимаю кнопку, таймер перестает работать.

Кто-нибудь знает, почему?


person Vilo    schedule 16.09.2014    source источник
comment
Всегда неправильно хранить объект System.Threading.Timer в локальной переменной. Это не может поддерживать таймер в рабочем состоянии, эта ссылка исчезает, когда ваш метод возвращается. Вернее, раньше. Когда ссылки не осталось, сборщик мусора собирает объект Timer, и ваш обратный вызов перестает вызываться. Вы должны хранить его в поле класса, объект которого существует достаточно долго. Статическая переменная, если вам нужно. А где же этот дубликат... Позже.   -  person Hans Passant    schedule 17.09.2014
comment
Действительно, если я сохраню его в поле класса, проблема будет решена. Спасибо за помощь. Я увижу больше объяснений о System.Threading, возможно, мне это не очень понятно :)   -  person Vilo    schedule 18.09.2014