您的位置:首页 > 编程语言 > C#

c#中的定时器的使用

2015-06-08 16:02 357 查看
在Framework中存在着4种定时器:其中分为两类,

多线程计时器

1:System.Threading.Timer

2:System.Timers.Timer

特殊目的的单线程计时器:

1:System.Windows.Forms.Timer(Windows Forms Timer)

2:System.Windows.Threading.DispatcherTimer(WPF timer);

多线程计时器比较强大,精确,而且可扩展性强;
单线程计时器的优点:

单线程计时器比较安全,对于更新 Windows Forms controls或者WPF这种简单任务来说更方便

你可以忘记线程安全。

一个Tick事件在前一个Tick事件被处理完毕前不会被触发。

你可以直接在Tick事件处理代码中更新控件,不需要调用Control.Invoke或Dispatcher.Invoke.

单线程计时器的缺点:除非Tick事件的处理代码执行的非常快,否则UI界面会变得响应很慢。

所以 WPF和Windows Forms的计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。否则,你需要一个多线程计时器

一 System.Threading.Timer是最简单的多线程计时器。在下面的例子中,定时器在5秒后开始定时1秒的调用Tick方法。

public static void Main ()

{

//5秒后开始运行,接着每隔1秒的调用Tick方法

Timer tmr = new Timer(Tick, "tick...", 5000, 1000);

Console.ReadLine();

tmr.Dispose();

}

static void Tick(object data)

{

Console.WriteLine(data);

}

二 System.Threading.Timer进行了包装。增加了下面几个特性。

实现了Component,所以可以在设计器显示。

代替Change方法的一个Interval属性

代替callback委托的一个Elapsed事件

启动和停止timer的Enabled属性,默认是false。

为了避免Enabled造成混乱,提供了Start和Stop方法。

是否在每次指定的间隔结束时引发Elapsed时间,还是仅间隔第一次结束后运行的AutoReset属性。

在WPF或Windows Forms中安全的调用方法的SynchronizingObject对象。

public static void MainThread()

{

Timer tmr = new Timer();

tmr.Interval = 500;

tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);

tmr.Start();

Console.ReadLine();

tmr.Stop();

Console.ReadLine();

tmr.Start();

Console.ReadLine();

tmr.Dispose();

}

static void tmr_Elapsed(object sender, ElapsedEventArgs e)

{

Console.WriteLine("Tick...");

三 如果运行下面的代码,会发现UI界面响应速度很慢,

//基于Windows消息循环的单线程计时器

private System.Windows.Forms.Timer timer = new Timer() { };

public Form1()

{

InitializeComponent();

timer.Tick += new EventHandler(timer_Tick);

timer.Enabled = true;

}

void timer_Tick(object sender, EventArgs e)

{

//模拟的做一些耗时的操作

System.Threading.Thread.Sleep(2000);

}

原理上面已经介绍了:单线程计时器基于Windows消息循环,应用程序会同步的处理计时器的消息。

解决这个问题的方法是使用多线程计时器:只要修改代码使用多线程计时器即可:

//使用多线程计时器

private System.Timers.Timer timer = new System.Timers.Timer();

public Form1()

{

InitializeComponent();

timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);

timer.Enabled = true;

}

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

{

//模拟的做一些耗时的操作

System.Threading.Thread.Sleep(2000);

}

转载:http://m.blog.csdn.net/blog/m1654399928/21713311

在C#里关于定时器类就有3个

1.定义在System.Windows.Forms里

2.定义在System.Threading.Timer类里

3.定义在System.Timers.Timer类里

System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使用API SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console Application(控制台应用程序)无法使用。

System.Timers.Timer和System.Threading.Timer非常类似,它们是通过.NET Thread Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。

例1:

使用System.Timers.Timer类

复制代码代码如下:

System.Timers.Timer t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒;

t.Elapsed += new System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件;

t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);

t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;

public void theout(object source, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show("OK!");

}

例2:System.Threading.Timer类的TimerCallback 委托

System.Threading.Timer 是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。

只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。当不再需要计时器时,请使用 Dispose 方法释放计时器持有的资源。

使用 TimerCallback 委托指定希望 Timer 执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程中执行,而是在系统提供的线程池线程中执行。

创建计时器时,可以指定在第一次执行方法之前等待的时间量(截止时间)以及此后的执行期间等待的时间量(时间周期)。可以使用 Change 方法更改这些值或禁用计时器。

Demo application:

应用场景:在windows form程序自动执行某项工作后,希望其windows form能够自动关闭。

代码设计:

(1)首先声明Timer变量:private System.Threading.Timer timerClose;

(2)在上述自动执行代码后面添加如下Timer实例化代码:

复制代码代码如下:

// Create a timer thread and start it

timerClose = new System.Threading.Timer(new TimerCallback(timerCall), this, 5000, 0);

Timer构造函数参数说明:

Callback:一个 TimerCallback 委托,表示要执行的方法。

State:一个包含回调方法要使用的信息的对象,或者为空引用(Visual Basic 中为 Nothing)。

dueTime:调用 callback 之前延迟的时间量(以毫秒为单位)。指定 Timeout.Infinite 以防止计时器开始计时。指定零 (0) 以立即启动计时器。

Period:调用 callback 的时间间隔(以毫秒为单位)。指定 Timeout.Infinite 可以禁用定期终止。

(3)定义TimerCallback委托要执行的方法:

复制代码代码如下:

private void timerCall(object obj)

{

timerClose.Dispose();

this.Close();

}

当然,除了使用上述System.Threading.Timer类的TimerCallback 委托机制外,应该还有很多其他的办法。另外,这里只是demo了TimerCallback委托的简单应用。

转载:http://www.jb51.net/article/46330.htm

下面的代码通过Timer定时器每隔1000毫秒(1秒)触发一次事件,C#中timer定时器的用法演示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: