Здесь у меня странное поведение в моем тестовом коде, код довольно прост, создается куча таймеров с одинаковым шаблоном: добавьте Thread.Sleep во весь обратный вызов. Затем запустите таймеры почти в одно и то же время, затем я вижу, что обратный вызов таймера был с задержкой.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 + ", [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: первые два обратных вызова всегда вызываются в то время, а последние всегда задерживаются, это мой результат теста: введенное время: 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' –