2011-04-07 30 views
1

我正在使用Windows窗体启动System.Timers.Timer以每3秒触发一个事件。当我关闭表单时,这个过程继续进行,这很好。当我重新打开表单以停止点击一个按钮btnSendOff_Click时发生问题。如何停止System.Timers.Timer

System.Timers.Timer sendTimer = new System.Timers.Timer(); 
    sendTimer.Elapsed += new ElapsedEventHandler(sendProcessTimerEvent); 
    sendTimer.Interval = 3000; 

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

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

    private void btnSendOff_Click(object sender, EventArgs e) 
    { 
     sendTimer.Stop(); 
    } 

此表单上将会有更多异步定时器。当我重新打开表单时,如何停止计时器?

+1

调用'.Stop()'就可以了?你可以让它成为一个静态成员,或者在课堂以外引用它来保持对它的引用 – 2011-04-07 11:00:11

回答

2

如果窗体关闭后需要继续运行,则表单不应该在每次创建窗体的新实例时创建一个新的计时器。您已经声明计时器的方式,每次创建表单时都会创建另一个计时器。您应该将计时器放在不同的表格中,或者将其声明在某个全局模块中,并且仅使表格激活或取消激活计时器。如果计时器在表单关闭时需要保持运行状态,则表单不应该是拥有或创建计时器的表单。如果计时器不是需要在窗体关闭时继续运行,那么您应该使用Forms.Timer而不是System.Timer。

编辑:添加示例代码

static class Program 
{ 
    public static System.Timers.Timer sendTimer; 
    public static System.Text.StringBuilder accumulatedText; 

    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     sendTimer = new System.Timers.Timer(); 
     accumulatedText = new System.Text.StringBuilder("Started at " + DateTime.Now.ToLongTimeString() + Environment.NewLine); 
     sendTimer.Interval = 3000; 
     sendTimer.Elapsed += new System.Timers.ElapsedEventHandler(sendProcessTimerEvent); 
     Application.Run(new MainForm()); 
    } 

    static void sendProcessTimerEvent(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     accumulatedText.AppendLine("Pinged at " + DateTime.Now.ToLongTimeString()); 
    } 
} 

class MainForm : Form 
{ 
    ToolStrip mainToolStrip = new ToolStrip(); 
    public MainForm() 
    { 
     mainToolStrip.Items.Add("Log Control").Click += new EventHandler(MainForm_Click); 
     Controls.Add(mainToolStrip); 
    } 

    void MainForm_Click(object sender, EventArgs e) 
    { 
     Form1 frm = new Form1(); 
     frm.ShowDialog(); 
    } 
} 

class Form1 : Form 
{ 
    private Button button1 = new Button(); 
    private TextBox text1 = new TextBox(); 
    public Form1() 
    { 
     button1.Dock = DockStyle.Bottom; 
     button1.Text = Program.sendTimer.Enabled ? "Stop": "Start"; 
     button1.Click += new EventHandler(button1_Click); 
     text1 = new TextBox(); 
     text1.Dock = DockStyle.Fill; 
     text1.Multiline= true; 
     text1.ScrollBars = ScrollBars.Vertical; 
     text1.Text = Program.accumulatedText.ToString(); 
     Controls.AddRange(new Control[] {button1, text1}); 
    } 

    void button1_Click(object sender, EventArgs e) 
    { 
     Program.sendTimer.Enabled = !Program.sendTimer.Enabled; 
     button1.Text = Program.sendTimer.Enabled ? "Stop" : "Start"; 
    } 
} 
+0

好的,这是我所做的,但仍然会遇到同样的问题。我移动了System.Timers.Timer sendTimer = new System.Timers.Timer(); sendTimer.Elapsed + = new ElapsedEventHandler(sendProcessTimerEvent); sendTimer.Interval = 3000; private void sendProcessTimerEvent(... to another form(form2),and放置了sendTimer.Elapsed + = new ElapsedEventHandler(sendProcessTimerEvent); 在form2的初始化当我从form1调用form2.sendTimer.Start()时,事件开始处理,但是当我关闭form1并重新打开它时,我无法停止该进程。 – Alex 2011-04-07 12:37:00

+0

我想说我将sendTimer.Elapsed + = new ElapsedEventHandler(sendProcessTimerEvent);放在错误的地方...我是创建新的定时器,而不是重用现有的任何想法我做错了什么? – Alex 2011-04-07 12:42:06

+0

是的,你不应该添加一个处理程序的Elapsed事件的形式之一。应该有一个事件处理程序设置时,定时器然后在表单中,您只应设置启用或使用“开始”和“停止”;或者您应在表单关闭时移除事件处理程序。 – BlueMonkMN 2011-04-08 14:44:14