首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎样关闭和释放System.Timers.Timer?解决方法

2012-09-28 
怎样关闭和释放System.Timers.Timer?下面的代码使用了System.Timers.Timer类:C# codepublic Form controlB

怎样关闭和释放System.Timers.Timer?
下面的代码使用了System.Timers.Timer类:

C# code
        public Form controlBox;        public delegate void delegateM(int i);        delegateM dm;        System.Timers.Timer timer;        controlBox = new Form();        timer = new System.Timers.Timer();        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);        timer.AutoReset = true;        timer.Interval = 50;        timer.Enabled = true;        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)        {            dm = Move;            try            {                controlBox.Invoke(dm, new object[] { top });//跨线程移动窗体,引发了多个异常                  timer.Enabled = true;            }            catch { }        }        void Move(int top)        {            controlBox.Top = top;        }

上面的代码在触发定时器时移动窗体controlBox,当退出窗体controlBox时,运行下面的代码,关闭timer
C# code
         timer.Stop();         timer.Close();

执行代码timer.Close();之后,通过调试发现,程序引发了多个异常:“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”引发异常的语句正是代码中注释的那句话。
这说明定时器仍然在工作,不停地在触发Elapsed事件。
我应该怎样关闭timer呢?谢谢

[解决办法]
加个判断试一试


 void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (this.Textbox1.InvokeRequired)
{
dm = Move;
try
{
controlBox.Invoke(dm, new object[] { top });//跨线程移动窗体,引发了多个异常
timer.Enabled = true;
}
catch { }
}
}


[解决办法]
关闭Timer后,timer_Elapsed会再进很多次,还是只有一两次。只有一两次就没有问题了。可能是线程之间的同步问题。

热点排行