Остановка таймера C #

#c# #timer

#c# #таймер

Вопрос:

Для теста я создал класс, который просто подсчитывает int каждую секунду:

 class TestComp1
{
    public TestComp1()
    {
        var timer = new Timer(o => TestInt  ,null,0,1000);
    }

    [ViewableProperty]
    public int TestInt { get; set; } = 0;
}
 

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

У кого-нибудь есть идеи относительно того, почему это происходит?

Комментарии:

1. Какой тестовый фреймворк вы используете? Или вы используете какое-то приложение? веб-сайт?

2. Я использую NUnit с Resharper Testrunner.

Ответ №1:

У вас нет ссылки на таймер вне области действия конструктора. В тот момент, когда конструктор завершен, на таймер больше не ссылаются, и он будет собран сборщиком мусора.

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

 class TestComp1
{
    private Timer _timer;

    public TestComp1()
    {
        _timer = new Timer(o => TestInt  ,null,0,1000);
    }

    [ViewableProperty]
    public int TestInt { get; set; } = 0;
}
 

Комментарии:

1. Ну, это действительно была проблема. Ура для неожиданного сбора мусора =)