为什么System.Timer不会更改类成员变量?

时间:2011-01-06 12:27:25

标签: c# winforms timer global-variables

我有一个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 个答案:

答案 0 :(得分:3)

作为另一个经验教训,为什么在提问问题时应始终发布真正的代码...

您的问题的解决方案似乎比其他答案建议的要简单得多。计时器的Tick事件永远不会被提升,因此价值enterHere变量永远不会被更改,因为你实际上从未启动计时器。更具体地说,这一行不正确:

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

构造函数不启动计时器;您需要拨打Start method documentation确认这一点,其中说:

  

创建新计时器时,它被禁用;也就是说,Enabled设置为false。要启用计时器,请调用Start方法或将Enabled设置为true。

绝对没有理由不清楚Application.DoEvents这样的事情,如果你不必这样做。

答案 1 :(得分:2)

我假设您使用的是System.Windows.Forms.Timer,在这种情况下,Tick事件将与您的function()在同一个帖子上运行。你可以把

Application.DoEvents();

在你的循环中让计时器打勾。或者,您可以使用另一个计时器(例如System.Threading),它在不同的线程上执行。

答案 2 :(得分:1)

您在WHILE(...)循环中还做了什么,并在代码运行时检查了处理器使用情况?如果循环运行得非常快,那么您的应用就没有时间处理它的消息并对定时器消息作出反应。

正如deltreme所说,在循环中插入Application.DoEvents();应该让它有机会处理消息。

答案 3 :(得分:0)

理想情况下,如果你有一个这样的循环,计时器应该在不同的线程中运行。计时器永远无法举起活动。

另外,你可以调用DoEvents()来让计时器完成它的工作