3

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

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

我从 8 小时开始就被困在这个问题上,现在在半夜我正在寻求帮助。欢迎所有提示和建议。

先感谢您!

描述

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

我的问题

如果我关闭该表格 B 并再次打开它n次,那么每个计时器“滴答”该命令都会执行n+1次。我想不通。我还注意到,如果我打开表单 B,更改DWithDHeigh1and 3,关闭表单,再次打开它,将值更改为2and 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);

其中89是打开表单 B 后命令的默认值

我试过的

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

出于好奇,我试图将myTimer.AutoResetvalue 更改为 false。还是同样的问题。只是它不是每 x 秒重复一次。

我的问题

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

来源

表格 B 从表格 A 中打开是这样的:

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

在 Form BI 中有这样的内容:

public partial class rD : Form
{
        public NetworkCom Ncom;
    string scfile;
    static System.Timers.Timer  myTimer = new System.Timers.Timer(1000);
    static bool exitFlag = false;
    Thread displayupdater;
    public rD(NetworkCom _ncom)
    {
        // Other code
        Ncom = _ncom;
        displayupdater = rundisplay();
    }

    public Thread rundisplay()
    {
        exitFlag = false;
        Thread updateThread = new Thread(() => updatescreen());
        updateThread.Name = "display";
        updateThread.Start();
        return updateThread;            
    }

    public void updatescreen()
    {
        myTimer.AutoReset = true;
        myTimer.Elapsed += new ElapsedEventHandler(TimerEventProcessor);
            myTimer.Interval = 1000;
            myTimer.Start();
            while(exitFlag == false) 
            {
                Application.DoEvents();
            }

    }

    private void TimerEventProcessor(Object myObject,EventArgs myEventArgs) 
        {
        scfile = Ncom.sendcmd("gsc|||" +DWith+"|||"+DHeigh+"$", false);
    }

        void RDFormClosing(object sender, FormClosingEventArgs e)
    {
        exitFlag = true;
        myTimer.Stop();
        myTimer.Close();
        displayupdater.Abort();
    }
    // More inessential code
}
4

1 回答 1

3

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

于 2013-05-10T13:50:46.990 回答