为什么System.Timers.Timer在关闭并重新打开表单后多次触发

时间:2013-05-10 01:00:32

标签: c# multithreading winforms .net-4.0 timer

我的第一个问题。我希望我不会犯任何错误......

我是一名初学自学成才的爱好者C#程序员(书籍,谷歌搜索,msdn,并为自己编写应用程序)。 我忘记了这可能是一些愚蠢或明显的事情,但我不能自己解决这个问题。谷歌让我失望,所以我需要一些帮助和指导。

我从8个小时开始坚持到现在,现在在半夜我正在寻求帮助。 欢迎提供所有提示和建议。

提前谢谢!

描述

我有2个表格。 OnButtomclick表单A运行表单B,问题所在。 在表格B中的所有其他内容(控件等)中,我有一个在线程中运行的计时器,它每隔x秒向服务器发送一个命令scfile = Ncom.sendcmd("gsc|||" +DWith+"|||"+DHeigh+"$", false)。 在表单B打开后触发计时器和线程。 在表格B上,我有一个控件(组合框),它最终会更改myTimer.Interval和另一个(Tickbar)的值,以控制DWithDHeigh

的值

我的问题

如果我关闭表格B并再次打开 n 次,则每个计时器“勾选”该命令执行 n + 1 次。我无法弄清楚这一点。 另外我注意到,如果我打开表单B,将DWithDHeigh更改为13,请关闭表单,再次打开,将值更改为{{1 }和2,再次关闭并打开它,每个计时器滴答我将被执行:

5

scfile = Ncom.sendcmd("gsc|||" +1+"|||"+3+"$", false);

scfile = Ncom.sendcmd("gsc|||" +2+"|||"+5+"$", false);

而不仅仅是:

scfile = Ncom.sendcmd("gsc|||" +8+"|||"+9+"$", false);

其中scfile = Ncom.sendcmd("gsc|||" +8+"|||"+9+"$", false);8是打开表单B后命令的默认值

我尝试了什么

我虽然可能线程未完成或计时器未停止。所以在My FormClosing事件9中,我尝试了所有内容,包括RDFormClosing(object sender, FormClosingEventArgs e)(我知道中止/杀死线程是一个坏主意),但仍然没有运气。

出于好奇,我试图将Thread.Abort();值更改为false。仍然是同样的问题。只是它没有每隔x秒重复一次。

我的问题

我错过了什么?为什么会发生这种情况,即使我在关闭表格B之前停止计时器并杀死线程?如何解决?

来源

表格B从表格A中打开:

myTimer.AutoReset

在表格B中我有这样的事情:

void ButtonSDeClick(object sender, System.EventArgs e)
{
    rD form = new rD(Ncom);
    form.Show();
    form.Closed += new System.EventHandler(DesktopFormClosed);
}

1 个答案:

答案 0 :(得分:3)

您的计时器是静态的,而您的表单则不是。因此,每次注册Elapsed时,它都会聚合。正如其他人所评论的那样,在表格关闭时删除该事件应该照顾它。