C# 定时器

C# 定时器,c#,winforms,timer,C#,Winforms,Timer,我的应用程序如下所示: 我有一个MDI父窗体form1,启动和停止计时器Form2的窗体,以及一个包含所有计时器逻辑的timerCalls类 表格1代码: TimerCalls timerCalls = new TimerCalls(); public SMS() { InitializeComponent(); timerCalls.InitializeTimer(); } 表格2代码: TimerCalls timerCalls = new TimerCalls();

我的应用程序如下所示:

我有一个MDI父窗体form1,启动和停止计时器Form2的窗体,以及一个包含所有计时器逻辑的timerCalls类

表格1代码:

TimerCalls timerCalls = new TimerCalls();

public SMS()
{
    InitializeComponent();
    timerCalls.InitializeTimer();
}
表格2代码:

TimerCalls timerCalls = new TimerCalls();

public Form2()
{
    InitializeComponent();
}

private void btnSendOn_Click(object sender, EventArgs e)
{
    timerCalls.sendTimer.Start();
}

private void btnSendOff_Click(object sender, EventArgs e)
{
    timerCalls.sendTimer.Stop();
}
TimerCalls类别代码:

class TimerCalls
{
    public System.Timers.Timer sendTimer = new System.Timers.Timer();
    public System.Timers.Timer recTimer = new System.Timers.Timer();

    public void InitializeTimer()
    {
        // Send timer
        sendTimer.Elapsed += new ElapsedEventHandler(sendProcessTimerEvent);
        sendTimer.Interval = 3000;
        //rec timer
        recTimer.Elapsed += new ElapsedEventHandler(recProcessTimerEvent);
        recTimer.Interval = 3000;
    }

    private void sendProcessTimerEvent(object sender, EventArgs e)
    {
        MessageBox.Show("Send 3 sec");
    }

    private void recProcessTimerEvent(object sender, EventArgs e)
    {
        MessageBox.Show("Rec 3 sec");
    }
}
这就是问题所在:我打开form2,启动计时器,关闭form2,再次打开它,然后尝试停止计时器,但它没有停止。一旦我重新打开form2,我所能做的就是启动和停止一个新的计时器,但前一个计时器仍在运行。在我关闭form2之前,一切正常(计时器启动和停止)。如果在我关闭表单时计时器已打开,我无法在再次打开表单2时停止它


如何修复此问题?

关闭Form2并重新打开后,将再次运行此操作:

public System.Timers.Timer sendTimer = new System.Timers.Timer();
public System.Timers.Timer recTimer = new System.Timers.Timer();

public void InitializeTimer()
{
    // Send timer
    sendTimer.Elapsed += new ElapsedEventHandler(sendProcessTimerEvent);
    sendTimer.Interval = 3000;

    // Rec timer
    recTimer.Elapsed += new ElapsedEventHandler(recProcessTimerEvent);
    recTimer.Interval = 3000;
}

您的第一个计时器在不同的线程上运行,并且没有停止,当您第二次打开Form2时,一个新的计时器被初始化,因此现在您有两个计时器,并且您只能控制最后一个计时器。

您正在创建多个
TimerCalls
-换句话说,没有单个时间实例,而是有多个。当为不同的实例调用stop时,不能期望停止正在运行的计时器


创建一个
TimerCalls
的单例实例,这将解决您的问题。

每次打开一个新窗体2时,一个新的计时器将被初始化。这将是一个你开始和停止。我建议将您的Timer类设置为singleton,或者将单个timerCalls实例的引用从Form1传递到每个新的Form2

假设您正在关闭表单,然后创建一个新的,然后是,它将创建Form2的多个实例

正如其他人所建议的那样,最好的方法是使用TimerCalls模式,只需在Form2中获取实例

如果这听起来像是太多的工作,只需隐藏Form2而不是关闭它:

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.UserClosing)
        return;
    e.Cancel = true;
    Hide();
}
然后,只要确保当你点击按钮重新打开Form2时,你只会显示之前创建的一个——类似这样

public class Form1 : Form
{
    private Form2 mForm2;

    protected void OpenForm2_Click(object sender, EventArgs e)
    {
       if (mForm2 == null)  
           mForm2 = new Form2();
       mForm2.Show();
    }
}
你是如何“重新打开”Form2的?