我的应用程序如下所示:
我有一个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后就无法停止它。
我该如何解决这个问题?
答案 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