如何在 class C# 中停止计时器 运行

How to stop a timer running inside a class C#

我在 class 中有一个计时器 运行。我有两个按钮。 按钮 1 用于启动计时器(在 class 内) 按钮 2 用于强行停止计时器。 单击按钮 1 并执行计算时,计时器运行平稳。 但是当我按下按钮 2 时,计时器并没有强行停止并抛出异常

An unhandled exception of type 'System.NullReferenceException' occurred ".

注意:如果我使用public static System.Timers.Timer theTimer1;然后可以用按钮停止计时器 2.But 我不想使用静态,当条件为真时它会自动停止但停止方法不适用于按钮。 我怎样才能用按钮停止这个计时器。 谢谢

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();             
    } 

    Test acc = new Test();

    private void button1_Click(object sender, EventArgs e) 
    {
        acc.SerialPortEvent()
    }

    private void button2_Click(object sender, EventArgs e) 
    {
        acc.stop();
    }
}

class Test
{
    public System.Timers.Timer theTimer1;

    public void SerialPortEvent()
    {
        theTimer1 = new System.Timers.Timer(10000);
        theTimer1.Elapsed += timer_Tick;
        theTimer1.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        //Perform some calculations here.
        if (something like counter)
        {
            stop();
        }
    }

    public void stop()
    {
        theTimer1.Stop();
        theTimer1.Dispose();
    }
}

Test的构造函数中初始化定时器:

class Test
{
   public Test()
   {
       theTimer1 = new System.Timers.Timer(10000);
   }

您的代码仅在调用 SerialPortEvent() 时才初始化计时器。

在您按下 Start 按钮之前不会调用此方法,因此当您在没有先按下 Start 的情况下按下 Stop 时会出现空引用异常。

此外,您的 stop() 函数处理计时器。当您在处理后尝试停止计时器时,这可能会成为一个问题。

您很可能是想从不同的线程

停止计时器

所以让我们假设您在线程 1 中,并且您创建了对在线程 2 中实例化的计时器的引用。一段时间后,线程 1 结束并且您在线程 3 中,您正在尝试达到该目标来自线程 1 的引用。这就是你得到空引用异常的原因。

您应该使用静态、可变或任务和任务取消令牌。

public volatile System.Timers.Timer theTimer1;