C# 中的三种计时器实现详解

需积分: 12 6 下载量 17 浏览量 更新于2024-09-10 收藏 1KB TXT 举报
"C# 三种计时器" 在C#编程中,计时器是实现定时任务或触发特定事件的关键组件。本文将探讨两种常见的C#计时器:System.Timers.Timer和System.Threading.Timer。 ### 1. System.Timers.Timer System.Timers.Timer是.NET框架中的一个类,它属于System.Timers命名空间。这个计时器主要用于在应用程序的不同线程间触发事件,适合跨线程操作。以下是如何使用它的示例: ```csharp System.Timers.Timer timer = new System.Timers.Timer(); // 创建计时器对象 timer.Interval = shootPinlv * 1000; // 设置间隔时间,以毫秒为单位 timer.Elapsed += new System.Timers.ElapsedEventHandler(Shoot); // 注册Elapsed事件处理器 public void Shoot(object source, System.Timers.ElapsedEventArgs e) { // 在这里编写当计时器触发时要执行的代码 } timer.Start(); // 开始计时器 ``` 在上面的代码中,`Shoot`方法将在每次计时器间隔到达时被调用。`Elapsed`事件在计时器周期结束时触发。请注意,`Interval`属性设置的是两次触发事件之间的时间间隔。 ### 2. System.Threading.Timer System.Threading.Timer是另一个C#计时器,它属于System.Threading命名空间。与System.Timers.Timer不同,它不自动创建后台线程来处理事件,而是将回调方法放在调用线程的上下文中。这使得它更适合于控制线程执行的任务。 ```csharp private System.Threading.Timer timerClose; timerClose = new System.Threading.Timer(new TimerCallback(timerCall), this, 5000, 0); private void timerCall(object obj) { timerClose.Dispose(); // 停止计时器 this.Close(); // 执行关闭操作 } // Timer构造函数参数说明: // Callback:一个TimerCallback委托,表示要执行的方法。 // State:一个包含回调方法要使用的信息的对象,或者为空引用。 // dueTime:调用Callback之前延迟的时间量,以毫秒为单位。Timeout.Infinite表示永不触发,0表示立即触发。 // Period:调用Callback的时间间隔,以毫秒为单位。Timeout.Infinite可禁用定期触发。 ``` 在这个例子中,`timerCall`方法会在5秒后被调用一次,然后计时器被销毁。`TimerCallback`委托用于指定计时器触发时要执行的方法,而`State`参数可以传递任何自定义数据到回调方法。 ### 选择合适的计时器 选择System.Timers.Timer还是System.Threading.Timer取决于具体的应用场景。如果需要在后台线程上执行任务且任务可能耗时较长,那么System.Timers.Timer更为合适,因为它会自动管理线程。相反,如果希望回调方法在特定线程上下文(如UI线程)中运行,或者只需要一次性触发,System.Threading.Timer是更好的选择。 总结来说,C#的计时器提供了灵活的机制来实现定时任务,可以根据需求选择合适的类型。正确理解和使用这两种计时器对于编写高效、稳定的多线程应用程序至关重要。