Почему System.Timer не меняет переменную члена класса? - PullRequest
2 голосов
/ 06 января 2011

У меня есть цикл while, и в этом цикле есть условие if.Но условие будет изменено таймером.Но таймер никогда не меняет глобальную переменную.Я не могу понять.В чем проблема?

Пример:

bool enterHere = false;
Timer timer = new Timer(); //Timer Started

private void timer_Tick(object Sender, ...)
{
    enterHere = true;
}

private void function()
{
   while(...)
   {
       if(enterHere)
       {
           //Never enter here
       }
   }
}

Ответы [ 4 ]

3 голосов
/ 06 января 2011

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

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

Timer timer = new Timer(); //Timer Started

Конструктор не запускает таймер;вам нужно вызвать его Start метод . Это подтверждается документацией , в которой говорится:

При создании нового таймераэто отключено;то есть Enabled имеет значение false.Чтобы включить таймер, вызовите метод Start или установите для Enabled значение true.

Абсолютно нет причин портить что-то вроде Application.DoEvents, если вам не нужно.

2 голосов
/ 06 января 2011

Я предполагаю, что вы используете System.Windows.Forms.Timer, и в этом случае событие Tick будет выполняться в том же потоке, что и ваш function(). Вы можете поставить

Application.DoEvents();

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

1 голос
/ 06 января 2011

Что еще вы делаете в цикле WHILE(...) и проверяли ли вы использование процессора во время работы вашего кода? Если цикл работает очень быстро, у вашего приложения нет времени обрабатывать его сообщения и реагировать на сообщение таймера.

Как говорит deltreme, вставка Application.DoEvents(); в цикл должна дать ему возможность обработать сообщение.

0 голосов
/ 06 января 2011

В идеале таймер должен работать в другом потоке, если у вас есть такой цикл.Таймер никогда не сможет вызвать событие.

В качестве альтернативы вы можете вызвать DoEvents (), чтобы таймер смог выполнить свою работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...