timer失踪之谜
timer失踪之谜
今天下午,写了一个小程序,来测试一下WCF。小项目中有一个客户端,轮询通过服务查找最新的订单。
在程序中,我首先使用了System.window.forms.form.timer控件+backgroundWork控件 和 System.Threading.timer来实现。BackgroundWork有一段时间没有用了,但通过查找MSDN,仍然实现了。
但是在用System.Threading.timer来实现的时候,出现了几个小问题。一个是在写委托delegate的时候,老是提示方法不匹配。调试半天,才发现我把委托实现在方法外,变成了这样的:
class test
{
Delegate void changeUIDelegate(Order[] source);
changeUIDelegate delegateMethod=new changeUIDelegate(changeMethod);
void changeMethod(Order[] source)
{
//change the ui.
}
}
就这个问题浪费了近半个小时,唉,太粗心了。
第二个问题更是愚蠢到了极点,在客户端的Form_Load方法里面,我是这样写的
protect void Form1_Load(...)
{
TimerBack back=new TimerBack(otherMethod);
//每隔三秒执行一下otherMthod
Threading.Timer=new Timer(back,null,0,3000);
}
可是奇怪的事情发生了,Timer执行了2-3次之后,变停止了。我调试了半天找不到原因,我起初认为是线程死锁,在otherMethod中加了同步控制,仍然是这种情况。郁闷。
最后,在网上狂google了一番,终于发现了原委:我犯了一个十分低级的错误,竟然把timer作为一个局部变量,在Formlaod执行完之后,timer就被内存回收了。
终于豁然开朗............
郁闷了一下午。
今天下午,写了一个小程序,来测试一下WCF。小项目中有一个客户端,轮询通过服务查找最新的订单。
在程序中,我首先使用了System.window.forms.form.timer控件+backgroundWork控件 和 System.Threading.timer来实现。BackgroundWork有一段时间没有用了,但通过查找MSDN,仍然实现了。
但是在用System.Threading.timer来实现的时候,出现了几个小问题。一个是在写委托delegate的时候,老是提示方法不匹配。调试半天,才发现我把委托实现在方法外,变成了这样的:
class test
{
Delegate void changeUIDelegate(Order[] source);
changeUIDelegate delegateMethod=new changeUIDelegate(changeMethod);
void changeMethod(Order[] source)
{
//change the ui.
}
}
就这个问题浪费了近半个小时,唉,太粗心了。
第二个问题更是愚蠢到了极点,在客户端的Form_Load方法里面,我是这样写的
protect void Form1_Load(...)
{
TimerBack back=new TimerBack(otherMethod);
//每隔三秒执行一下otherMthod
Threading.Timer=new Timer(back,null,0,3000);
}
可是奇怪的事情发生了,Timer执行了2-3次之后,变停止了。我调试了半天找不到原因,我起初认为是线程死锁,在otherMethod中加了同步控制,仍然是这种情况。郁闷。
最后,在网上狂google了一番,终于发现了原委:我犯了一个十分低级的错误,竟然把timer作为一个局部变量,在Formlaod执行完之后,timer就被内存回收了。
终于豁然开朗............
郁闷了一下午。