【问题标题】:How to stop System.Timers.Timer如何停止 System.Timers.Timer
【发布时间】:2011-04-07 10:58:03
【问题描述】:

我正在使用 Windows 窗体启动 System.Timers.Timer 以每 3 秒触发一次事件。当我关闭表单时,该过程会继续触发,这很好。当我重新打开表单以在单击按钮 btnSendOff_Click 时停止计时器时,就会出现问题。

    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();
    }

这个表单上会有更多的异步定时器。重新打开表单时如何停止此计时器?

【问题讨论】:

  • 致电.Stop() 就可以了?您可以将其设为静态成员或在类外部引用它以保持对它的引用

标签: c# winforms timer


【解决方案1】:

如果表单需要在表单关闭后继续运行,则不应在每次创建表单的新实例时创建新的计时器。您声明计时器的方式,每次创建表单时都会创建另一个。您应该将计时器放在不同的表单上或在某个全局模块中声明它,并且只使表单激活或停用计时器。如果在表单关闭时计时器需要继续运行,则表单不应该是拥有或创建计时器的人。如果在表单关闭时计时器不需要继续运行,那么您应该使用 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";
    }
}

【讨论】:

  • 好的,这就是我所做的,但仍然遇到同样的问题。我移动了 System.Timers.Timer sendTimer = new System.Timers.Timer(); sendTimer.Elapsed += new ElapsedEventHandler(sendProcessTimerEvent); sendTimer.Interval = 3000; private void sendProcessTimerEvent(... 到另一个表单(form2),并将sendTimer.Elapsed += new ElapsedEventHandler(sendProcessTimerEvent); 放在form2初始化中。当我从form1调用form2.sendTimer.Start()时,事件开始处理,但是当我关闭 form1 并重新打开它时,我无法停止该过程。
  • 我想说我正在放置 sendTimer.Elapsed += new ElapsedEventHandler(sendProcessTimerEvent);在错误的地方......我正在创建新的计时器,而不是重用现有的计时器。有什么想法我做错了吗??
  • 是的,您也不应该将处理程序添加到表单中的 Elapsed 事件。创建计时器时应该设置一个事件处理程序。然后在表单中,您应该只设置启用或使用开始和停止。或者您应该在表单关闭时删除事件处理程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2011-06-20
相关资源
最近更新 更多