这里我有一个奇怪的行为,在我的测试代码中,代码很简单,创建了一堆具有相同模式的定时器:在所有回调中添加一个Thread.Sleep。然后几乎同时启动计时器,然后我可以看到一些计时器的回调是延迟。Thread.Sleep导致Timer的回调延迟
public class StrangTimerTesting
{
public int callback_EnteredTimes;
// for avoid timers get GCed.
private List<System.Timers.Timer> timerContainer = new List<System.Timers.Timer>();
public void Go()
{
for (var i = 0; i < 5; i++)
{
var displayTimer = new System.Timers.Timer(1000);
displayTimer.Elapsed += (a, b) =>
{
Interlocked.Increment(ref this.callback_EnteredTimes);
var initalTime = DateTime.Now.ToString("HH:mm:ss.ffff");
Console.WriteLine("entered times: " + callback_EnteredTimes + ", [email protected]" + initalTime);
displayTimer.Stop();
// why this Sleep cause some callback delayed to be called????
Thread.Sleep(6000);
};
displayTimer.Start();
timerContainer.Add(displayTimer);
}
}
}
我想所有的回调将被称为几乎相同的时间,虽然在不同的线程池线程,但测试结果显然不支持这一点,有一些必备2秒差距,如果我删除那Thread.Sleep,那么一切都很好。有人可以指出原因吗?
EDIT1:这是从测试程序的结果是:
*进入次数:1,INTIAL @ 08:43:29.4732
进入次数:2,INTIAL @ 08:43:29.4762
进入次数:3,INTIAL @ 08:43:30.4763
进入次数:4,INTIAL @ 08:43:30.9764
进入次数:5,INTIAL @ 08:43:31.4764 *
而且MinThreads在我的笔记本电脑计数为2
总是延迟还是第一次? –
@Sriram:第一2回调始终称为在时间,而后者的总是延迟,这是我的测试结果:进入次数:1,INTIAL @ 16:48:53.6435 进入次数:2,INTIAL @ 16: 48:53.6435 输入次数:3,intial @ 16:48:54.6896 输入次数:4,intial @ 16:48:55.1436 输入次数:5,intial @ 16:48:55.6437 – Shawn
您拥有多少核心?你有没有尝试设置'ThreadPool.SetMinThreads' –