问个关于 private System.Timers.Timer 的问题

tank_2009 2009-10-19 06:30:03

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 都是在一个新开的线程当中运行吗 ?
...全文
116 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengliuliuxiang 2009-10-19
  • 打赏
  • 举报
回复
xue xi
tank_2009 2009-10-19
  • 打赏
  • 举报
回复
差不多问题清楚了,谢谢8楼跟10楼。谢谢。
yijiecc 2009-10-19
  • 打赏
  • 举报
回复
定时器线程是从线程池里调出来的,准确的说不算新开的线程,因为没有创建线程。
系统决定在线程池的哪一个线程上触发事件,不应该假设每次都在同一个线程上触发事件。但是,为减少开销,系统会尽量将其安排在同一个线程。在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);
}
}
}
wjq 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tank_2009 的回复:]
C# codepublicpartialclass Form1 : Form
{
System.Timers.Timer timer=new System.Timers.Timer(5000);public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls=false;

}privatevoid 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);
}
}
}

我自己写了一段代码,来测试,现在几乎可以得到结果 , 肯定会定时开启新的线程 。

[/Quote]

没看出你这代码说明什么问题,开线程是肯定的,但不会每次执行都开一个新线程。

    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
}

}
cc_net 2009-10-19
  • 打赏
  • 举报
回复
Timer的创建线程是UI线程,而执行线程是TheardPool中的线程

Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的 Elapsed 事件,这样就可以比 Windows 计时器更精确地按时引发事件。Elapsed 事件在 ThreadPool 线程上引发。如果 Elapsed 事件的处理时间比 Interval 长,在另一个 ThreadPool 线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。

http://blog.csdn.net/cc_net/archive/2008/12/06/3461549.aspx
tank_2009 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyq11 的回复:]
System.Windows.Forms.Timer是通过Windows消息机制实现的
System.Timers.Timer和System.Threading.Timer非常类似,通过.NET  Thread  Pool实现的
被线程池管理
[/Quote]

每一次触发 Elapsed ,都是开启的新线程对吧?
wuyq11 2009-10-19
  • 打赏
  • 举报
回复
System.Windows.Forms.Timer是通过Windows消息机制实现的
System.Timers.Timer和System.Threading.Timer非常类似,通过.NET Thread Pool实现的
被线程池管理
tank_2009 2009-10-19
  • 打赏
  • 举报
回复

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);
}
}
}


我自己写了一段代码,来测试,现在几乎可以得到结果 , 肯定会定时开启新的线程 。
fengjian_428 2009-10-19
  • 打赏
  • 举报
回复
System.Timers.Timer应该是被线程池管理的
而线程池里面挂起的线程据说超过40秒不使用的话也会被销毁
wjq 2009-10-19
  • 打赏
  • 举报
回复
应该不是,System.Timers.Timer本身开一个线程循环以及触发Elapsed事件。
另外,System.Windows.Forms.Timer则是在主线程下的。
SQL77 2009-10-19
  • 打赏
  • 举报
回复
应该不是吧,学习,

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧