
C#中Forms.Timer、Timers.Timer与Threading.Timer的使用解析
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本文深入探讨了C#编程语言中的三种定时器类——Forms.Timer、Timers.Timer和Threading.Timer的特性和应用场景,为开发者提供详细的使用指南。
在C#中,有三种Timer类可供使用:`System.Windows.Forms.Timer`、`System.Timers.Timer` 和 `System.Threading.Timer`。这些Timer类都是.NET Framework提供的,并且各有特点,适用于不同的场景。
**System.Windows.Forms.Timer**
此Timer专为Windows Forms应用程序设计。它基于Windows消息循环并通过事件方式触发Tick事件。设置Interval后,在指定的时间间隔内调用挂接在Tick事件上的EventHandler。由于该Timer运行于UI线程中,因此在处理程序中可以直接修改UI元素而无需担心跨线程访问问题。然而,这也意味着若在处理程序执行长时间操作,则可能阻塞消息队列导致Tick事件丢失或界面无响应。此外,Windows.Forms.Timer的精度较低,约为55毫秒。
```csharp
public partial class Form1 : Form
{
int num = 0;
public Form1()
{
InitializeComponent();
this.Form_Timer.Tick += new System.EventHandler(this.Form_Timer_Tick);
}
private void Form_Timer_Tick(object sender, EventArgs e)
{
label1.Text = (++num).ToString();
Thread.Sleep(3000); //这会导致UI线程阻塞
}
private void button1_Click(object sender, EventArgs e)
{
Form_Timer.Start();
}
private void button2_Click(object sender, EventArgs e)
{
Form_Timer.Stop();
}
}
```
**System.Timers.Timer**
此Timer独立于UI线程,在单独的线程上运行,通过Elapsed事件触发。因此它更适合执行后台任务而不影响UI线程。AutoReset属性控制计时器在触发后是否自动重置以再次启动周期。相较于Windows.Forms.Timer,它提供了更好的性能和更精确的时间间隔控制。
```csharp
using System.Timers;
public partial class Form1 : Form
{
private Timer timer = new Timer();
public Form1()
{
InitializeComponent();
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Interval = 1000; //每秒触发一次
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
执行后台任务
}
private void button1_Click(object sender, EventArgs e)
{
timer.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
timer.Enabled = false;
}
}
```
**System.Threading.Timer**
此Timer是最灵活的,因为它可以在任何线程上运行并提供了更多的控制选项。它的Callback参数是一个委托,在计时器触发时调用该委托。这个Timer没有自动重置功能,因此需要在回调方法中手动管理。
```csharp
using System.Threading;
public partial class Form1 : Form
{
private Timer timer;
public Form1()
{
InitializeComponent();
timer = new Timer(TimerCallback, null, 1000, Timeout.Infinite);
}
private void TimerCallback(object state)
{
执行任务
如果需要再次触发,可以调用timer.Change(1000, Timeout.Infinite);
}
private void button1_Click(object sender, EventArgs e)
{
timer.Change(1000, Timeout.Infinite);
}
private void button2_Click(object sender, EventArgs e)
{
timer.Change(Timeout.Infinite, Timeout.Infinite);
}
}
```
总结来说,选择哪种Timer取决于你的需求。如果你需要在UI线程上执行操作且对精度要求不高,可以选择`System.Windows.Forms.Timer`;如果要在后台线程上执行任务而不影响UI线程,则使用`System.Timers.Timer`是好的选择;而当需要更多控制权和灵活性时,应考虑使用`System.Threading.Timer`. 在实际开发中,根据应用的需求和性能需求来挑选最适合的Timer类。
全部评论 (0)


