这里我的测试代码中有一个奇怪的行为,代码很简单,创建了一堆具有相同模式的定时器:在所有回调中添加一个Thread.Sleep 。然后几乎同时启动定时器,然后我可以看到一些定时器的回调被延迟。
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 + ", intial@" + 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,初始@08:43:29.4762
输入次数:3,初始@08:43:30.4763
输入次数:4,初始@08:43:30.9764
输入次数:5,初始@08:43:31.4764*
我的笔记本电脑中的 MinThreads 计数为 2。