日期:2014-05-17  浏览次数:20900 次

C# 中的 Threading.Timer问题
我的代码基本是这样的:

        private static object objectlock = new object();
  
        public void Start()
        {
            TimerCallback timerDelegate = new TimerCallback(this.timer_Elapsed);
            this.timer = new Timer(timerDelegate, null, 0, 5000);
        }

        void timer_Elapsed(object sender)
        {
            lock (objectlock)
            { // 其他操作 }
        }


我的问题是,在timer_Elapsed中的lock中的操作,可能耗时很久(10来分钟到几个小时不等),我的理解是,这个计时器每隔5秒就会触发一次timer_Elapsed,由于timer_Elapsed中lock起来了,所以之后线程就会一直等待这里解锁。计时器每隔5秒就会触发一次,如果lock里的代码执行时间太长了,这里应该会有很多线程在等待,这样会影响系统性能或导致异常发生吗?我想在lock里先把timer先停止了,在操作都完成后,在把timer启动。

------解决方案--------------------
你这种情况下,线程池会创建很新的线程,然后阻塞,导致性能问题。
解决方法:
this.timer = new Timer(timerDelegate, null, 0, 5000);
改为
this.timer = new Timer(timerDelegate, null, 0, Timeout.Infinite);
这样会导致下次调用的时间是无限大之后。其实就是为手动控制提供余地。

callback方法最后:
this.timer.Change(0,Timeout.Infinite);
马上开始下次调用,下下次调用时间为无限大之后。