编程语言
首页 > 编程语言> > c#-为什么System.Timers.Timer经过时间在关闭并重新打开表单后多次触发

c#-为什么System.Timers.Timer经过时间在关闭并重新打开表单后多次触发

作者:互联网

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

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

我从8个小时开始就一直坚持下去,现在半夜我正在寻求帮助.
欢迎所有提示和建议.

先感谢您!

描述

我有两种形式. OnButtomclick窗体A正在运行问题所在的窗体B.
在窗体B中,除其他外(控件等),我有一个在线程中运行的计时器,该线程正在发送命令scfile = Ncom.sendcmd(“ gsc |||” DWith“ |||” DHeigh“ $”,false)每隔x秒发送到服务器.
窗体B打开后,将触发计时器和线程.
在表格B上,我有一个控件(组合框),该控件最终将更改myTimer.Interval的值,而另一个控件(刻度线)以控制DWith和DHeigh的值

我的问题

如果我关闭该窗体B并再次将其打开n次,则每个计时器“滴答”一声,命令将执行n次.我不知道这个.
我还注意到,如果我打开窗体B,将DWith和DHeigh更改为1和3,关闭该窗体,再次打开它,将值更改为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和9是打开表格B后命令的默认值

我尝试了什么

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

出于好奇,我试图将myTimer.AutoReset值更改为false.还是一样的问题.只是没有每x秒重复一次.

我的问题

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

资源

像这样从A表格中打开B表格:

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

在表格B中,我有类似以下内容:

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
}

解决方法:

您的计时器是静态的,您的表格不是.因此,每次您注册“已逝”时,它都会聚合.正如其他人所评论的那样,在关闭表单中删除该事件应引起注意.

标签:multithreading,timer,c,winforms,net-4-0
来源: https://codeday.me/bug/20191123/2066719.html