private System.Timers.Timer timerCount;timerCount= new System.Timers.Timer(1000);
timerCount.Elapsed += new ElapsedEventHandler(timerCount_Elapsed);
timerCount.Enabled = true;
void timerCount_Elapsed(object sender, ElapsedEventArgs e)
{
// do something.
}我想问问,是不是每隔1秒,timerCount_Elapsed 都是在一个新开的线程当中运行吗 ?
另外,System.Windows.Forms.Timer则是在主线程下的。
而线程池里面挂起的线程据说超过40秒不使用的话也会被销毁
public partial class Form1 : Form
{
System.Timers.Timer timer = new System.Timers.Timer(5000);
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
} private void Form1_Load(object sender, EventArgs e)
{
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
} void timer_Elapsed(object sender, ElapsedEventArgs e)
{
string k = DateTime.Now.ToString();
while (true)
{
Thread.Sleep(1000);
listBox1.Items.Add(k);
}
}
}
我自己写了一段代码,来测试,现在几乎可以得到结果 , 肯定会定时开启新的线程 。
System.Timers.Timer和System.Threading.Timer非常类似,通过.NET Thread Pool实现的
被线程池管理
每一次触发 Elapsed ,都是开启的新线程对吧?
没看出你这代码说明什么问题,开线程是肯定的,但不会每次执行都开一个新线程。 public partial class Form1 : Form
{
System.Timers.Timer timer = new System.Timers.Timer(1000);
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
} private void Form1_Load(object sender, EventArgs e)
{
timer.Enabled = true;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
this.Text = Thread.CurrentThread.GetHashCode().ToString(); //主线程hash
} void timer_Elapsed(object sender, ElapsedEventArgs e)
{
listBox1.Items.Add(Thread.CurrentThread.GetHashCode());//每次执行elapsed的时候的线程hash
} }
系统决定在线程池的哪一个线程上触发事件,不应该假设每次都在同一个线程上触发事件。但是,为减少开销,系统会尽量将其安排在同一个线程。在8楼所说的情况下,即Elapsed事件处理时间超过Interval,就会在另一个线程上触发事件。using System;
using System.Timers;namespace timer
{
class Program
{
public static void Main(string[] args)
{
Timer timer=new Timer(1000);
timer.Elapsed+= new ElapsedEventHandler(timer_Elapsed);
timer.Start();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
} static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine(System.Threading.Thread.CurrentThread.GetHashCode());
System.Threading.Thread.Sleep(1500);
}
}
}