关于C# 如何关闭Timer所执行的已阻塞的方法

laonawuli 2012-12-06 12:30:38
大家好,我的主程序中有个Timer,每五秒触发一次Timer_Tick方法,为了保证同一时间只有一个Timer_Tick方法被执行,所以在Timer_Tick的开头便写了Timer.Enable=false;然后在Timer_Tick的结尾写Timer.Enable=true;

Timer_Tick()
{
Timer.Enable=false;

SendMessage();

Timer.Enable=true;
}

SendMessage()方法中,调用了一个dll中的发送信息的方法A,而这个方法A,有一定几率彻底阻塞(是这个dll的BUG,而我又无法改变),所以一出现这种情况,本次的Timer_Tick()就彻底卡在这里了。

为了解决这个问题,我在SendMessage中,又起了一个新的计时器Timer_TimeOut,在执行方法A之前开始计时,如果A可以在短时间内执行过去,则关闭Timer_TimeOut。如果卡在了A处,则Timer_TimeOut到60秒后,就可以通知主程序,本次Timer_Tick()卡死了。

接下来,我就可以在Timer_TimeOut_Tick中再次设置Timer.Enable=true;即可再次启动新的Timer_Tick()。

问题来了,当我在Timer_TimeOut_Tick中再次设置Timer.Enable=true;启动新的Timer_Tick()后,第一个启动的Timer_Tick方法,会被系统回收吗?我不希望这个Timer_Tick一直卡在那里,否则,很有可能,会产生一堆阻塞的Timer_Tick方法。

谢谢大家。
...全文
346 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
laonawuli 2012-12-06
  • 打赏
  • 举报
回复
引用 2 楼 LOVESONGFOREVER 的回复:
既然SendMessage中发送消息不可避免的会引起阻塞,那么为何不用异步呢? 同步解决不了的问题为何不用异步试试呢? timer并不是好东西。
额,必须这么写...不这样写,会使事情变得很复杂。不知大侠对我的问题是否有思路呢?
garfieldzf 2012-12-06
  • 打赏
  • 举报
回复
既然SendMessage中发送消息不可避免的会引起阻塞,那么为何不用异步呢? 同步解决不了的问题为何不用异步试试呢? timer并不是好东西。
laonawuli 2012-12-06
  • 打赏
  • 举报
回复
顶一下~!!!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧