【问题标题】:C# background worker and timer loopC# 后台工作者和定时器循环
【发布时间】:2010-04-05 18:19:00
【问题描述】:

这是我第一次尝试计时器,如果有人能帮我找出哪里出错了,那就太棒了。

我正在尝试使用 while 循环,如果计时器达到 30 秒,请尝试再次循环。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Windows.Forms.Timer my_timer = new System.Windows.Forms.Timer();
        my_timer = null;
        //int restartticker = 30000;
        while (true)
        {
            my_timer.Start();
            if (my_timer.Equals(30000))
            {
                watcherprocess1();
            }
            my_timer = null;
        }
    }

对象引用未设置为对象的实例。 my_timer.Start();

【问题讨论】:

  • >.> 您在实例化后立即设置my_timer = null;。因此NullReferenceException
  • 从逻辑上思考,你为什么会得到NullReferenceException
  • 实际上你设置了两次my_timer = null;,一次在循环之前,一次在循环中。

标签: c#


【解决方案1】:

您的错误是由您将 Timer 设置为 null 引起的,要解决此问题,只需删除 my_timer = null; (2x)。

但是 Timer 不太适合“暂停”线程 (BGW)。一个简单的解决方案如下所示:

    while (true)
    {
         Thread.Sleep(30000);
         watcherprocess1();
    }

编辑:

我发现了你的previous question。共识(但不是公认的答案)是建议使用 Timer 而不是 Backgroundworker,而不是inside Backgroundworker。

【讨论】:

  • 我认为你已经非常接近他所需要的,除非我遗漏了什么。
  • 如果 watcherprocess 运行的时间超过了一些无限小的时间,比如 1.5 秒,但他需要它每 3 秒运行一次怎么办?在那种情况下,他会想睡 1.5 秒,而不是 3 秒,而且跟踪它会很痛苦。因此需要一个计时器而不是睡眠。
  • @mmr,他需要一个秒表 + 另一个循环,而不是计时器。但我不打算推​​测那么远。
【解决方案2】:

是这些行(你应该删除它们):

my_timer = null;

没有代码 cmets,我无法给你一个像样的选择(即,我不知道你为什么首先要这样做)。

【讨论】:

    【解决方案3】:

    为什么要创建Timer 对象,然后立即将其设置为null

    您应该订阅Tick 事件,并将您的代码放入其中。如果你设置它的间隔,它应该每三十秒自动循环一次。

    【讨论】:

      【解决方案4】:

      这是使用 Timer 类的完全错误的尝试。 my_timer.Equals(30000) 永远不会评估为 true,因为 Timer 不会覆盖 Object.Equals()

      如果您想在计时器达到 30 秒时执行某项操作,则必须将 my_timer.Interval 设置为 30000,然后订阅 my_timer.Tick 事件。

      您可能想看看 Timer 类的 documentation

      正如其他人所说,不要这样做my_timer = null

      【讨论】:

        【解决方案5】:

        您初始化计时器,然后将其设置回 null:

        my_timer = null;
        

        这意味着当您调用 my_timer.Start() 时,my_timer 没有任何值...因此出现异常。

        很遗憾,如果您没有更好地了解您要完成的工作,我们将无法帮助您编写更好的代码来完成工作。

        【讨论】:

          猜你喜欢
          • 2011-02-04
          • 1970-01-01
          • 2011-10-30
          • 2011-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多