【问题标题】:Why System.Timer doesn't change class member variable?为什么 System.Timer 不更改类成员变量?
【发布时间】:2011-01-06 21:58:29
【问题描述】:

我有一个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
       }
   }
}

【问题讨论】:

    标签: c# winforms timer global-variables


    【解决方案1】:

    作为另一个教训,为什么你应该总是发布你的真实代码,当你问关于 SO...的问题时......

    看来您的问题的解决方案比其他答案建议的要简单得多。计时器的 Tick 事件永远不会被引发,因此 enterHere 变量的值永远不会改变,因为你从来没有真正启动计时器。更具体地说,这行是不正确的:

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

    构造函数不启动定时器;你需要打电话给它的Start method这是由documentation确认的,上面写着:

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

    如果没有必要,绝对没有理由对 Application.DoEvents 之类的事情感到厌烦。

    【讨论】:

      【解决方案2】:

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

      Application.DoEvents();
      

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

      【讨论】:

      • 谢谢。多么简单的答案:)
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果你有这样的循环,理想情况下计时器应该在不同的线程中运行。计时器将永远无法引发事件。

        您也可以调用 DoEvents() 来让计时器完成它的工作

        【讨论】:

          猜你喜欢
          • 2011-05-13
          • 2019-01-27
          • 2011-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多