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

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 15:07 点击:

 

概述(来自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>H

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • 浅析.NET下XML数据访问新机制
      • asp.net 面试+笔试题目第1/2页
      • C# 邮件地址是否合法的验证
      • asp.net 设置GridView的选中行的实现代码
      • C#高级编程:数据库连接[1]
      • 经典C++程序1
      • IIS 自动回收导致后台定时器失效的问题解决
      • ASP.NET&#160;GridView列表代码示例
      • Asp.net MVC源码分析--Action Filter的链式调用
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1