System.Timers.Timer的使用

本文介绍了一个使用System.Timers.Timer类实现的Winform项目案例,该案例用于实时更新并显示系统运行时间和当前时间,通过设置定时器的时间间隔为1000毫秒实现了较为精确的时间显示。

做一个Winform项目时用到了定时器,用来显示时间。考虑到使用自带的Timers控件会有误差,所以就选择了System.Timers.Timer类来实现,实际效果是一样的。

        //3,定义底部时间显示Timer
        public System.Timers.Timer tDayTime = null;
        public delegate void ShowTime();//定义委托
        //显示时间
        tDayTime = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为1000毫秒; 
        tDayTime.Elapsed += new System.Timers.ElapsedEventHandler(tDayTime_Elapsed);//到达时间的时候执行事件;
        tDayTime.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 
        tDayTime.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;

        /// <summary>
        /// 显示时间
        /// </summary>
        /// <param name="source"></param>
        /// <param name="e"></param>
        public void tDayTime_Elapsed(object source, System.Timers.ElapsedEventArgs e)
        {
            try
            {
                FomatDatetime();
            }
            catch (Exception ex)
            {
                #region 异常处理
                //将异常信息写入数据库    
                MNG_LOG_INFOCS.LogGeneral("显示时间:", ex.ToString(), VideoWatch_Log_ReportType_En.App_WinFormStart);
                //将异常信息写入日志()
                ExceptionErrorLog("显示时间:" + ex.ToString());
                #endregion
            }
        }
        /// <summary>
        /// 显示时间
        /// </summary>
        public void FomatDatetime()
        {
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new ShowTime(FomatDatetime));
            }
            else
            {
                System.TimeSpan diff = DateTime.Now.Subtract(startTime);
                string runTime = "系统已经运行了:" + diff.Days + "天" + diff.Hours + "小时" + diff.Minutes + "分钟" + diff.Seconds + "秒";
                this.toolStripStatuslblDayTime.Text = runTime;
                this.statuslblDayTime.Text = "系统时间:" + DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss");
            }
        }








                
<think>好的,用户想了解C#中System.Timers.TimerSystem.Threading.Timer的区别和用法。我需要先回忆这两个类的特点,然后根据提供的引用资料整理信息。 首先,根据引用[1]和[4],System.Threading.Timer是轻量级的,使用回调方法,由线程池线程处理。而System.Timers.Timer是基于事件的,更适合服务器应用。引用[4]提到,System.Threading.Timer不适合Windows Forms,因为回调不在UI线程,而System.Windows.Forms.Timer更适合窗体应用。System.Timers.Timer则引发事件,可能有更多的功能。 接着看用法部分,引用[3]和[5]给出了代码示例。System.Threading.Timer需要创建实例并传入回调函数,而System.Timers.Timer则通过Elapsed事件来绑定处理方法,并且可以设置AutoReset等属性。 用户可能需要两者的主要区别,包括线程模型、使用场景、功能特性等。需要比较它们的初始化方式、线程安全性、是否自动重置、如何停止等。还要注意异常处理,比如引用[3]中的try-catch块。 另外,引用[2]和[5]提到System.Timers.Timer的定时执行方法,可能需要说明如何开始和停止定时器,比如调用Start()和Stop()方法,或者Dispose()来释放资源。 需要将信息整理成结构清晰的回答,分点比较,可能包括适用场景、线程模型、使用方式、功能特性等。同时,根据用户要求,生成相关问题,如性能比较、如何选择、线程安全问题等。 最后,确保使用正确的中文表达,按照系统指令的格式要求,行内公式用$...$,独立公式用$$...$$,不过这个问题可能不涉及数学公式,但要注意代码块的使用和引用标注的位置。</think>### System.Timers.Timer vs System.Threading.Timer 对比分析 #### 1. **基础特性** - **System.Threading.Timer** 轻量级计时器,通过线程池线程执行回调函数,适用于后台任务[^4]。初始化方式: ```csharp System.Threading.Timer _timer = new Timer(callback, null, 0, 1000); ``` 需手动处理资源释放(`Dispose()`)[^3]。 - **System.Timers.Timer** 基于事件的计时器,通过`Elapsed`事件触发操作,支持自动重置(`AutoReset`属性)和同步控制[^5]。初始化示例: ```csharp System.Timers.Timer mT0 = new System.Timers.Timer(1000); mT0.Elapsed += MT0_Elapsed; mT0.AutoReset = true; ``` #### 2. **线程模型对比** | 特性 | System.Threading.Timer | System.Timers.Timer | |---------------------|------------------------------|-----------------------------------| | **执行线程** | 线程池线程(非UI线程)[^4] | 默认线程池线程,可同步到UI线程[^5] | | **UI兼容性** | 不直接支持(需Invoke) | 需手动同步(如WPF的Dispatcher) | | **资源管理** | 显式调用`Dispose()`[^3] | 通过`Stop()`或`Dispose()`控制 | #### 3. **关键区别** - **异常处理** - `System.Threading.Timer`:回调中未捕获的异常会导致进程崩溃[^3]。 - `System.Timers.Timer`:可通过`Elapsed`事件内的try-catch处理异常。 - **功能扩展** `System.Timers.Timer`支持`SynchronizingObject`属性,用于在UI线程同步执行[^5]。 #### 4. **应用场景** - **System.Threading.Timer** 后台周期性任务(如日志清理、数据同步),无需UI交互[^4]。 - **System.Timers.Timer** 服务器端定时任务或需要事件机制的场景(如监控系统)[^1]。 #### 5. **性能与资源** - `System.Threading.Timer`更轻量,适合高频小任务(如毫秒级间隔)[^4]。 - `System.Timers.Timer`因事件机制略占资源,但功能更丰富[^1]。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值