我在这里的第一个问题。我希望我不会犯任何错误...
我是一名初学者自学成才的 C# 程序员(书籍、谷歌搜索、msdn 和为自己编写应用程序)。我可能忘记了一些愚蠢或明显的事情,但我自己无法解决这个问题。谷歌让我失望了,所以我需要一点帮助和指导。
我从 8 小时开始就被困在这个问题上,现在在半夜我正在寻求帮助。欢迎所有提示和建议。
先感谢您!
描述
我有 2 个表格。OnButtonclick 表单 A 正在运行问题所在的表单 B。在表单 B 中,除所有其他内容(控件等)外,我在线程中运行了一个计时器,该计时器scfile = Ncom.sendcmd("gsc|||" +DWith+"|||"+DHeigh+"$", false)
每 x 秒向服务器发送一个命令。定时器和线程在表单 B 打开后被触发。在表单 BI 上,有一个控件(组合框)用于最终更改 的值,myTimer.Interval
另一个(Tickbar)用于控制DWith
和DHeigh
我的问题
如果我关闭该表格 B 并再次打开它n次,那么每个计时器“滴答”该命令都会执行n+1次。我想不通。我还注意到,如果我打开表单 B,更改DWith
并DHeigh
说1
and 3
,关闭表单,再次打开它,将值更改为2
and 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
value 更改为 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
}