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