C#timers.timer

时间:2011-04-08 09:56:40

标签: c# winforms timer

我的应用程序如下所示:

我有一个MDI父窗体 - form1,启动和停止定时器的窗体 - 窗体2,以及一个带有所有定时器逻辑的timerCalls类。

Form1代码:

TimerCalls timerCalls = new TimerCalls();

public SMS()
{
    InitializeComponent();
    timerCalls.InitializeTimer();
}

Form2代码:

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。如果我关闭表单时计时器打开,我再次打开form2后就无法停止它。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

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

其他人建议的最佳方法是使用TimerCalls的singleton模式,只需在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();
    }
}

答案 1 :(得分:0)

关闭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时,新的计时器被初始化,所以现在你有两个计时器,你只能控制最后一个计时器。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

每次打开新的Form2时,都会初始化一个新的计时器。这将是你正在开始和停止的那个。我建议让你的Timer类成为单例,或者将一个timerCalls实例的引用从Form1传递给每个新的Form 2