当前位置:编程学习 > asp >>

.NET System.Timers.Timer的原理和使用(开发定时执行程序)

 

概述(来自MSDN)

 

Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发Elapsed 事件的周期性间隔。然后可以操控此事件以提供定期处理。例如,假设您有一台关键易做图器,必须每周7 天、每天24 小时都保持运行。可以创建一个使用Timer 的服务,以定期检查服务器并确保系统开启并在运行。如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员。

 

基于服务器的Timer 是为在多线程环境中用于辅助线程而设计的。服务器计时器可以在线程间移动来处理引发的Elapsed 事件,这样就可以比Windows 计时器更精确地按时引发事件。

 

基于Interval 属性的值,Timer 组件引发Elapsed 事件。可以处理该事件以执行所需的处理。例如,假设您有一个联机销售应用程序,它不断向数据库发送销售订单。编译发货指令的服务分批处理订单,而不是分别处理每个订单。可以使用Timer 每30 分钟启动一次批处理。

 

注意

 

当AutoReset设置为false时,Timer只在第一个Interval过后引发一次Elapsed事件。若要保持以Interval时间间隔引发Elapsed 事件,请将AutoReset设置为true。

Elapsed事件在ThreadPool线程上引发。如果Elapsed事件的处理时间比Interval长,在另一个hreadPool线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。

 

注意

 

在一个线程调用Stop 方法或将Enabled 属性设置为false 的同时,可在另一个线程上运行事件处理方法。这可能导致在计时器停止之后引发Elapsed 事件。Stop 方法的示例代码演示了一种避免此争用条件的方法。

如果和用户界面元素(如窗体或控件)一起使用Timer,请将包含有Timer 的窗体或控件赋值给SynchronizingObject 属性,以便将此事件封送到用户界面线程中。Timer 在运行时是不可见的。

 

 

 

几点说明

 

1 private System.Timers.Timer _TestTimerEvent= new Timer();

1   

 

1、默认的周期是0.1秒执行一次;

 

2、AutoReset的初始值为true.

 

3、它的timer机制和System.Threading.Timer 原理是一样的。

 

4、每次周期(Timer)运行一次会新起一个线程。

 

5、如果Elapsed事件的处理时间比Interval长,它每个周期执行都会新起一个线程,这个线程的执行时间不受interval的限定,可以比interval长,因为一个新周期执行,又会新起一个线程,Timer起的线程周期就是事件处理时间。

 

我们来看它的实现代码.(.net framework 提供的).

 

001 //------------------------------------------------------------------------------  

 

002 // <copyright file="Timer.cs" company="Microsoft"> 

 

003 //     Copyright (c) Microsoft Corporation.  All rights reserved. 

 

004 // </copyright> 

 

005 //-----------------------------------------------------------------------------  

 

006   

 

007 namespace System.Timers {  

 

008    

 

009     using System.Runtime.InteropServices; 

 

010     using System.Security;  

 

011     using System.Security.Permissions; 

 

012     using System.Threading; 

 

013     using System.ComponentModel; 

 

014     using System.ComponentModel.Design;  

 

015     using System; 

 

016     using Microsoft.Win32;  

 

017     using Microsoft.Win32.SafeHandles;  

 

018   

 

019     /// <devdoc>  

 

020     ///    <para>Handles recurring events in an application.</para> 

 

021     /// </devdoc> 

 

022     [ 

 

023     DefaultProperty("Interval"),  

 

024     DefaultEvent("Elapsed"), 

 

025     HostProtection(Synchronization=true, ExternalThreading=true)  

 

026     ]  

 

027     public class Timer : Component, ISupportInitialize { 

 

028         private double interval;  

 

029         private bool  enabled; 

 

030         private bool initializing; 

 

031         private bool delayedEnable; 

 

032         private ElapsedEventHandler onIntervalElapsed;  

 

033         private bool autoReset; 

 

034         private ISynchronizeInvoke synchronizingObject;  

 

035         private bool disposed;  

 

036         private System.Threading.Timer timer; 

 

037         private TimerCallback callback;  

 

038         private Object cookie; 

 

039   

 

040         /// <devdoc> 

 

041         /// <para>Initializes a new instance of the <see cref='System.Timers.Timer'/> class, with the properties  

 

042         ///    set to initial values.</para> 

 

043         /// </devdoc>  

 

044         public Timer()  

 

045         : base() { 

 

046             interval = 100;  

 

047             enabled = false; 

 

048             autoReset = true; 

 

049             initializing = false; 

 

050             delayedEnable = false;  

 

051             callback = new TimerCallback(this.MyTimerCallback); 

 

052         }  

 

053    

 

054         /// <devdoc> 

 

055    

补充:Web开发 , ASP.Net ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,