C#后台工作程序和计时器循环

C#后台工作程序和计时器循环,c#,C#,这是我第一次尝试计时器,如果有人能帮我找出哪里出了问题,那就太棒了 我尝试使用while循环,如果计时器达到30秒,尝试再次循环 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { System.Windows.Forms.Timer my_timer = new System.Windows.Forms.Timer(); my_timer = null;

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

我尝试使用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;
        }
    }
对象引用未设置为对象的实例。我的计时器。开始()

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


如果没有代码注释,我无法给您一个合适的替代方案(即,我不知道您为什么要这样做)。

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

my_timer = null;
这意味着当您调用
my\u timer.Start()
时,my\u timer没有值…因此出现异常


不幸的是,如果没有更好的想法,我们将无法帮助您使用更好的代码来完成任务。

您的错误是由于您将计时器设置为null,要解决此问题,只需删除
my_Timer=null(2x)

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

    while (true)
    {
         Thread.Sleep(30000);
         watcherprocess1();
    }
编辑:
我发现了你的眼睛。一致意见(但不是公认的答案)是建议使用计时器而不是Backgroundworker,而不是在Backgroundworker内部。

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


您应该订阅该活动,并将代码放在其中。如果您设置其间隔,它应该每30秒自动循环一次。

使用Timer类的尝试是完全错误的
my_timer.Equals(30000)
永远不会计算为true,因为计时器不会覆盖
Object.Equals()

如果要在计时器达到30秒时执行某项操作,必须将
my\u timer.Interval
设置为30000,然后订阅
my\u timer.Tick
事件

您可能想看看Timer类的


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

>。>您正在设置
my_timer=null紧接着实例化。因此
NullReferenceException
从逻辑上考虑,为什么会得到
NullReferenceException
?事实上,您正在设置
my_timer=null两次,一次在循环之前,一次在循环中。我认为你非常接近他所需要的,除非我遗漏了什么。如果Watcher进程需要超过无限小的时间来运行,比如1.5秒,但他需要每3秒运行一次该怎么办?如果是那样的话,他会想睡1.5秒,而不是3秒,而保持这种状态会很痛苦。因此需要计时器而不是睡眠。@嗯,他需要秒表+另一个循环,而不是计时器。但我不打算在这么远的将来进行推测。
    while (true)
    {
         Thread.Sleep(30000);
         watcherprocess1();
    }