如果每个计时器有1个线程?
例如:
class MyObj
{
private Timer _timer;
public MyObj()
{
Initialize();
}
private void Initialize()
{
_timer = new Timer(2000);
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
}
void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("MyObj !");
}
}
class Program
{
private static Timer _timer;
private static void Main(string[] args)
{
_timer = new Timer(500);
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
MyObj mo = new MyObj();
Console.Read();
}
static void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("Program !");
}
}
有两个帖子吗?
答案 0 :(得分:4)
计时器使用ThreadPool
,因此最多使用2个线程。但是,由于ThreadPool
中的线程被回收,它可能最终使用相同的线程两次,或者两个线程但不同时使用。
计时器本身不会导致创建线程。
此外,如果您的计时器永远不会打勾 - 它不会向ThreadPool
发布任何工作,所以本质上不会“花费”任何线程。
请注意,虽然tick线程是不确定的...你创建定时器的线程是不线程将发生勾号。你的tick中的任何逻辑都需要知道它可以与类中的其他东西并行运行。
答案 1 :(得分:3)
每个计时器没有保留的线程。事件在线程池线程上进行调度,并且在事件处理程序未运行时,计时器不会阻塞线程。由于存在多个线程池线程,因此事件处理程序仍然需要是线程安全的。
文档说明:
如果
SynchronizingObject
属性为Nothing
,则会在ThreadPool线程上引发Elapsed
事件。如果Elapsed事件的处理持续时间超过Interval
,则可能会在另一个ThreadPool线程上再次引发该事件。在这种情况下,事件处理程序应该是可重入的。