C#定时器

39 篇文章 1 订阅

在C#里关于定时器类有3个:
1.  定义在System.Windows.Forms里
实现在用户定义的时间间隔引发事件的计时器。此计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用。
命名空间:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)
备注:
Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。
使用此计时器时,请使用控件的Tick事件执行轮询操作,或在指定的时间内显示启动画面。每当 Enabled 属性设置为true且Interval属性大于0时,将引发Tick事件,引发的时间间隔基于Interval属性设置。
此类提供用于设置时间间隔以及启动和停止计时器的方法。
注意:Windows窗体Timer组件是单线程组件,精度限定为55毫秒。如果您需要更高精度的多线程计时器,请使用System.Timers命名空间中的Timer类。
线程安全:
此类型的任何公共静态(Visual Basic中的Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。
例子:
public class Class1 {
    static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
    static int alarmCounter = 1;
    static bool exitFlag = false;
    // This is the method to run when the timer is raised.
    private static void TimerEventProcessor(Object myObject,
                                            EventArgs myEventArgs) {
       myTimer.Stop();

       // Displays a message box asking whether to continue running the timer.
       if(MessageBox.Show("Continue running?", "Count is: " + alarmCounter,
          MessageBoxButtons.YesNo) == DialogResult.Yes) {
          // Restarts the timer and increments the counter.
          alarmCounter +=1;
          myTimer.Enabled = true;
       }
       else {
          // Stops the timer.
          exitFlag = true;
       }
    }
    public static int Main() {
       myTimer.Tick += new EventHandler(TimerEventProcessor);
       // Sets the timer interval to 5 seconds.
       myTimer.Interval = 5000;
       myTimer.Start();

       // Runs the timer, and raises the event.
       while(exitFlag == false) {
          // Processes all the events in the queue.
          Application.DoEvents();
       }
    return 0;
    }
 }

平台:
Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition
.NET Framework并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息:
.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0、1.0
         2.  定义在System.Timers.Timer类里
在应用程序中生成定期事件。
命名空间:System.Timers
程序集:System(在 system.dll 中)
备注:
注意:应用于此类的HostProtectionAttribute属性(Attribute)具有以下Resources属性 (Property)值:Synchronization | ExternalThreading。HostProtectionAttribute不影响桌面应用程序(这些应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见HostProtectionAttribute类或SQL Server编程和宿主保护属性。
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长,在另一个ThreadPool线程上将会再次引发此事件。因此,事件处理程序应当是可重入的。
        注意:在一个线程调用Stop方法或将Enabled属性设置为false的同时,可在另一个线程上运行事件处理方法。这可能导致在计时器停止之后引发Elapsed事件。Stop方法的示例代码演示了一种避免此争用条件的方法。
如果和用户界面元素(如窗体或控件)一起使用Timer,请将包含有Timer的窗体或控件赋值给SynchronizingObject属性,以便将此事件封送到用户界面线程中。
Timer在运行时是不可见的。
有关Timer的实例的初始属性值列表,请参见Timer构造函数。
线程安全:
此类型的任何公有static成员对多线程操作都是安全的。但不能保证任何实例成员是线程安全的。
例子:
使用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!");   
 }
平台:
Windows 98、Windows 2000 SP4、Windows Millennium Edition、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition
.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息:
.NET Framework
受以下版本支持:2.0、1.1、1.0
       3.  定义在System.Threading.Timer类里
提供以指定的时间间隔执行方法的机制。无法继承此类。
命名空间:System.Threading
程序集:mscorlib(在 mscorlib.dll 中)
备注:
注意:应用于此类的HostProtectionAttribute属性(Attribute)具有以下Resources属性 (Property)值:Synchronization | ExternalThreading。HostProtectionAttribute并不会影响桌面应用程序(桌面应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见HostProtectionAttribute类或SQL Server编程和宿主保护属性。

使用TimerCallback委托指定希望Timer执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程上执行,而是在系统提供的ThreadPool线程上执行。
创建计时器时,可以指定在第一次执行方法之前等待的时间量(截止时间)以及此后的执行期间等待的时间量(时间周期)。可以使用Change方法更改这些值或禁用计时器。
        注意:只要在使用Timer,就必须保留对它的引用。对于任何托管对象,如果没有对Timer的引用,计时器会被垃圾回收。即使Timer仍处在活动状态,也会被回收。(我在这里就出现了错误,计时器活动状态下却不运行了)当不再需要计时器时,请使用Dispose方法释放计时器持有的资源。如果希望在计时器被释放时接收到信号,请使用接受WaitHandle的Dispose(WaitHandle)方法重载。计时器已被释放后,WaitHandle便终止。
        由计时器执行的回调方法应该是可重入的,因为它是在ThreadPool线程上调用的。在以下两种情况中,此回调可以同时在两个线程池线程上执行:一是计时器间隔小于执行此回调所需的时间;二是所有线程池线程都在使用,此回调被多次排队。
注意:System.Threading.Timer是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。也可以考虑与 Windows窗体一起使用的System.Windows.Forms.Timer基于服务器计时器功能的System.Timers.Timer。这些计时器使用事件并具有附加功能。

线程安全:
该类型对于多线程操作是安全的。
using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        AutoResetEvent autoEvent     = new AutoResetEvent(false);
        StatusChecker  statusChecker = new StatusChecker(10);

        // Create the delegate that invokes methods for the timer.
        TimerCallback timerDelegate =
            new TimerCallback(statusChecker.CheckStatus);

        // Create a timer that signals the delegate to invoke
        // CheckStatus after one second, and every 1/4 second
        // thereafter.
        Console.WriteLine("{0} Creating timer.\n",
            DateTime.Now.ToString("h:mm:ss.fff"));
        Timer stateTimer =
                new Timer(timerDelegate, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every
        // 1/2 second.
        autoEvent.WaitOne(5000, false);
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period.\n");

        // When autoEvent signals the second time, dispose of
        // the timer.
        autoEvent.WaitOne(5000, false);
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    int invokeCount, maxCount;

    public StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.",
            DateTime.Now.ToString("h:mm:ss.fff"),
            (++invokeCount).ToString());

        if(invokeCount == maxCount)
        {
            // Reset the counter and signal Main.
            invokeCount  = 0;
            autoEvent.Set();
        }
    }
}

版本信息:
.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0、1.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值