.NET Framework里面提供了三种Timer:
- System.Windows.Forms.Timer
- System.Timers.Timer
- System.Threading.Timer
Visual Studio 2003的工具箱里面默认提供了System.Windows.Forms.Timer和System.Timers.Timer两种,而Visual Studio 2005中确只默认提供了System.Windows.Forms.Timer这一种。这里简单的介绍一下这两种Timer的区别。
System.Windows.Forms.Timer是使用得比较多的Timer,Timer Start之后定时(按设定的Interval)调用挂接在Tick事件上的EvnetHandler。在这种Timer的EventHandler中可以直接获取和修改UI元素而不会出现问题--因为这种Timer实际上就是在UI线程自身上进行调用的。也正是因为这个原因,导致了在Timer的EventHandler里面进行长时间的阻塞调用,将会阻塞界面响应的后果。下面是一个简单的例子:
public class MainForm : Form
{
private void MainForm_Load(object sender, EventArgs e)
{
timer.Interval = 1000;
timer.Tick += delegate(object o, EventArgs args)
{
DoWork();
};
timer.Start();
}
private void DoWork()
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000);
}
}
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
}
在这个例子中,DoWork方法里面将会阻塞10秒,在这10秒之内,UI将会失去响应。而通过使用System.Timers.Timer,就可以解决这个问题。因为System.Timers.Timer是在.NET的Thread Pool上面运行的,而不是直接在UI Thread上面运行,所以在这种Timer的EventHandler里面进行耗时较长的计算不会导致UI失去响应。但是这里有两个地方需要注意:
- 因为一般来说System.Timers.Timer不是运行在UI Thread上面的,所以如果要在这种Timer的EventHandler里面更新UI元素的话,需要进行一次线程切换,在WinForm开发中一般通过UI元素的Invoke方法完成:
private void DoWork()
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000);
}
this.Invoke(new UpdateUICallBack(UpdateUI));
}
private delegate void UpdateUICallBack();
private void UpdateUI()
{
}
- System.Timers.Timer有一个Property:SynchronizingObject 。如果设置了这个Property(一般是某个Form),那么之后对Timer挂接的EventHandler的调用将会在创建这个UI元素的线程上进行(一般来说就是UI线程)。值得注意的是,如果你通过WinForm设计器把System.Timers.Timer拖放到Form上,那么这个Property将会自动被设置。此时这种Timer就和System.Windows.Forms.Timer的效果一样:长调用将会阻塞界面。
分享到:
相关推荐
① System.Windows.Forms.Timer ② System.Timers.Timer ③ System.Threading.Timer 现分述如下: 一、System.Windows.Forms.Timer 1、基于Windows消息循环,用事件方式触发,在界面线程执行;是使用得比较多的Timer...
在.NET框架中,有三种不同类型的`Timer`类,它们分别是`System.Windows.Forms.Timer`、`System.Timers.Timer`和`System.Threading.Timer`,每种都有其特定的应用场景和特性。 1. **System.Windows.Forms.Timer** -...
与Windows Forms中的`System.Windows.Forms.Timer`不同,`System.Timers.Timer`在控制台应用或服务中更常见。 使用`System.Timers.Timer`非常直观,主要包括以下几个步骤: 1. 实例化Timer对象,设置间隔时间。例如...
在.NET框架中,有三种主要的Timer类,它们分别是System.Threading.Timer、System.Timers.Timer和System.Windows.Forms.Timer。这三种Timer各有特点,适用于不同的场景。接下来我们将深入探讨它们的实现方式,以及...
本文将详细介绍在C#编程语言中三种不同的定时器实现方式:`System.Windows.Forms.Timer`、`System.Timers.Timer`以及`System.Threading.Timer`。这三种定时器各有特点,适用于不同场景。 #### 二、`System.Windows....
与 `System.Windows.Forms.Timer` 相比,`System.Timers.Timer` 更适用于长时间运行的应用程序,因为它可以在应用程序的主线程暂停或挂起时继续运行,提供更精确的时间间隔控制。 #### 三、`System.Timers.Timer` ...
本示例项目“Timer_Test.rar”提供了三种不同类型的定时器的实现:System.Windows.Forms.Timer、System.Timers.Timer和System.Threading.Timer。每种定时器都有其特定的应用场景和特性,下面将详细介绍这三种定时器...
C#中提供了三种类型的计时器:基于 Windows 的标准计时器(System.Windows.Forms.Timer)、基于服务器的计时器(System.Timers.Timer)和线程计时器(System.Threading.Timer)。每种计时器都有其特点和使用场景,...
在Windows Forms(Winform)应用开发中,有时我们需要在用户界面上执行一些后台任务,例如定期检查网络状态或执行其他耗时操作。本例子重点介绍了如何利用`System.Timers.Timer`组件来实现这样的多线程操作,特别是...
尽管`System.Windows.Forms.Timer`直接在主线程上执行事件处理程序,但其他两种计时器类(`System.Threading.Timer`和`System.Timers.Timer`)则依赖于线程池来调度事件处理程序的执行。线程池是一种高效的机制,它...
本文主要讨论了两种常见的定时器:`System.Timers.Timer` 和 `System.Threading.Timer`,以及它们如何通过保活机制影响对象生命周期,并提供了相应的解决策略。 1、定时器保活机制: 在 C# 中,当一个对象持有对另...
本文将详细介绍`System.Windows.Forms.Timer`、`System.Timers.Timer`以及`System.Threading.Timer`三种不同类型的`TIMER`对象,并通过实例演示它们的基本用法。 #### 二、System.Windows.Forms.Timer `System....
根据不同的应用场景和需求,C#提供了几种不同类型的`Timer`,包括`System.Threading.Timer`、`System.Windows.Forms.Timer`以及`System.Timers.Timer`。本文将深入探讨这三种类型`Timer`的特点与工作原理。 ### `...
System.Threading.Timer 是一个简单的轻量计时器... 多线程计时器1:System.Threading.Timer2:System.Timers.Timer特殊目的的单线程计时器:1:System.Windows.Forms.Timer(Windows Forms Timer)2:System.Windows.
本文将详细介绍C#中的三种定时器类:`System.Windows.Forms.Timer`、`System.Threading.Timer`以及`System.Timers.Timer`,并分别给出示例代码和应用场景。 #### 二、`System.Windows.Forms.Timer` 类 `System....
这个程序是基于`System.Timers.Timer`和`System.Windows.Forms.Timer`类实现的,它能够进行多任务计时,并在指定时间点发出提醒。下面将详细阐述这两个定时器类的用法及其在构建闹钟程序中的作用。 1. **System....