Когда TimerCallback статичен, он будет выполняться только один раз и просто зависнет и даже заблокирует любые другие таймеры, такие как timer2.Это достигает конца метода, и никакие исключения не выбрасываются.Если я сделаю обратный вызов нестатичным, то он будет работать, как и ожидалось, вызывая метод каждые x секунд.Если я удаляю контекст базы данных, то он работает статически или нет.System.Threading.Timer должен ставить в очередь вызовы рабочего потока, поэтому даже если БД блокирует поток, я не вижу, как он может блокировать ВСЕ потоки, даже те, которые не обращаются к базе данных.Кто-нибудь может объяснить, почему он так себя ведет?
public class TimerClass
{
private System.Threading.Timer timer1;
private System.Threading.Timer timer2;
public void Start(TimeSpan CheckInterval)
{
//timer2 = new Timer(o => Console.WriteLine("Timer2: " + DateTime.Now.ToString()), null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
timer1 = new Timer(TimerCallback, null, TimeSpan.Zero, CheckInterval);
}
private static void TimerCallback(object state)
{
Console.WriteLine("Timer1: " + DateTime.Now.ToString());
using (MyDbEntities db = new MyDbEntities())
{
foreach (var item in db.Table)
Console.WriteLine(item.Name);
}
Console.WriteLine("Leaving Callback...");
}
}
Именно здесь запускается таймер.После запуска основной поток продолжит нормально, но таймеры все еще зависают.
static void Main()
{
TimerClass myTimer = new TimerClass();
myTimer.Start(TimeSpan.FromSeconds(1));
Console.WriteLine("Timer started...");
Console.ReadLine(); // pausing here, timers are still in-scope and should be firing
}