如何停止类C#中运行的计时器

本文关键字:运行 计时器 何停止 | 更新日期: 2023-09-27 18:01:09

我有一个在类中运行的计时器。我有两个按钮。按钮1用于启动计时器(位于类内(按下按钮2可强制停止计时器。单击按钮1并执行计算时,计时器运行平稳。但当我按下按钮2时,计时器不会强制停止,并抛出异常

发生"System.NullReferenceException"类型的未处理异常。

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

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();
    }
}

如何停止类C#中运行的计时器

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

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

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

在按下Start按钮之前不会调用此操作,因此,在未先按下Start的情况下按下Stop时,会得到一个空引用异常。

此外,您的stop()功能会处理计时器。当您试图在计时器被释放后停止计时器时,这可能是一个问题。

很可能您正试图从不同的线程停止计时器

因此,让我们假设您在线程1中,并创建一个对在线程2中实例化的计时器的引用。过了一段时间,线程1已经结束,您在线程3中尝试从线程1访问该引用。这就是为什么您得到了null引用异常。

您应该使用静态、易失性或任务和任务取消令牌。

public volatile System.Timers.Timer theTimer1;