我试图理解当System.Timers.Timer
引发elapsed事件时,它是在一个独立的线程中引发的吗?
我下面的例子似乎表明这三个计时器在各自的线程中独立运行:
class Program
{
static System.Timers.Timer timer = new System.Timers.Timer();
static System.Timers.Timer timer2 = new System.Timers.Timer();
static System.Timers.Timer timer3 = new System.Timers.Timer();
static void Main(string[] args)
{
timer.Elapsed += new System.Timers.ElapsedEventHandler(
timer_Elapsed);
timer2.Elapsed += new System.Timers.ElapsedEventHandler(
timer2_Elapsed);
timer3.Elapsed += new System.Timers.ElapsedEventHandler(
timer3_Elapsed);
timer.Interval = 1000;
timer2.Interval = 1000;
timer3.Interval = 1000;
timer.Start();
timer2.Start();
timer3.Start();
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
static void timer3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer3.Stop();
Console.WriteLine("Timer 3 Hit...");
timer3.Start();
}
static void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer2.Stop();
Console.WriteLine("Timer 2 Hit...");
Thread.Sleep(2000);
timer2.Start();
}
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Stop();
Console.WriteLine("Timer 1 Hit...");
Thread.Sleep(10000);
timer.Start();
}
}
发布于 2011-10-26 02:12:51
根据您的代码,它们必须是,因为Thread.Sleep
是一个阻塞调用。如果其他计时器在同一线程上运行,则它们都不会触发。
你可以在每一个文件中输出System.Threading.Thread.CurrentThread.ManagedThreadId
来确认。
发布于 2011-10-26 02:18:34
是的,每次调用Elapsed时,回调都会在它自己的线程上触发。
此外,在前一个事件处理程序完成之前,没有任何东西可以阻止该事件处理程序触发。例如,如果计时器每500毫秒触发一次,但经过的事件处理程序代码需要2秒才能完成,则经过的代码可能正在访问相同的资源(非线程安全的对象、文件等)。
https://stackoverflow.com/questions/7893773
复制相似问题