Вопрос

Я использую C # с компактными рамками 2, SP2.

ОС устройства была установлена, чтобы начать с моим приложением, давайте назовем приложение «Loader.exe».

Погрузчик - это просто это: одна простая форма, которая показывает сообщения о состоянии на протяжении всей загрузки, при необходимости (условия Layman для существа, имеющие ошибку и сообщение об исключении или «запускное приложение [XYZ]»), а также запустить станок На заднем плане пока отображается базовая полноэкранная форма.

То, что конструктор формы погрузчика имеет следующее на конце Очень END:

try
{
    label1.Text = "Starting GUI Init Thread...";  //debug only message
    System.Threading.Timer guiInit = new System.Threading.Timer(
        RunStateMachine, null, 2000, System.Threading.Timeout.Infinite
        );
    //callback: RunStateMachine, null argument
    //initial callback is 2000ms from this point, and doesn't run again.
}
catch (Exception ex1)
{
    label1.Text = "GUI Init Error 2";
    Failure_Label.Text = ex1.Message;
}
.

и «RunStatemachine» работает на другом потоке, чем пользовательский интерфейс, позволяющий отображать форму, и в любое время запускается за руль runstateMachine для взаимодействия с формой, такими как обновление сообщений, я вызывающую функцию, использующую, если (это. ) {this.invoke (...);} else {...}

Так, моя проблема?
Перерывается, моя программа будет зависать, и это потому, что таймер не вызывает обратный вызов. Я добавил в отладочную сообщение в блоке TRY выше, наряду со многими другими местами, чтобы сказать мне, где он повесил, включая сообщение в самом начале «RunstateMachine». В конце концов, моя программа повесила на сообщение «Начальная бита GUI init ...»

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

Мысли?

Это было полезно?

Решение

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

Похоже, вы хотите подтверждение, что это ваша проблема. Да, это проблема.

Таймер хранится в локальной переменной, которая никогда не используется снова.Это делает его право на GC.GC'инг таймера приводит к финализации, ведущей к таймеру, который будет отключен.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top