C# 定时器
我的应用程序如下所示: 我有一个MDI父窗体form1,启动和停止计时器Form2的窗体,以及一个包含所有计时器逻辑的timerCalls类 表格1代码: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();
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的?