如何停止类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();
}
}
初始化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;