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);
马上开始下次调用,下下次调用时间为无限大之后。