2011-04-07 66 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