避免定时器在复杂的任务中被反复启动的小技巧

本文介绍了一种避免定时器在执行不稳定时序任务时反复启动的方法。通过使用System.Threading.Timer,并将period设置为TimeOut.Infinite,使得定时器仅执行一次。在任务完成后,于回调方法中根据实际需求重新调用Change方法设定下次执行时间。此策略适用于执行时间不固定的FTP服务器查询或下载操作。确保在finally块中进行timer.Change,防止异常中断,并利用CancellationTokenSource控制定时器行为。实践证明,这种方法效果良好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们有时希望设计这样的程序,周期性的访问ftp服务器执行一些文件查询或下载,有时有的ftp服务器网络很好,速度很快,有时有的服务器网络较差,访问较慢,也就是说,查询或下载时间并不稳定,如果把定时器的时间指定为一个固定值,较大的值,时间浪费较多,较小的值,有时没查询完,定时器就启动下一次查询,解决办法也许较多,这里介绍一个非常好的解决办法,很实用,定时器选System.Threading空间下的Timer,在执行后台任务时,这个是最好用的定时器,把period参数设置为TimeOut.Infinite,这时定时器Timer只执行一次,然后在回调方法中,当完成大量复杂任务后,再设置Change方法,把dueTime设置要间隔的时间,把period再次设置为TimeOut.Infinite值,这样定时器再次被设置为执行一次,如此反复。代码见下:

class Program
    {
        private static Timer timer;
        private static CancellationTokenSource cts;
        static void Main(string[] args)
        {
            cts = new CancellationTokenSource();
            timer = new Timer(DoWork, cts, Timeout.Infinite, Timeout.Infinite);
            timer.Change(0, Timeout.Infinite);

            Console.WriteLine("按任意键取消运行");  
            Console.ReadKey();
            cts.Cancel();
            Console.WriteLine("运行结束");
            Console.ReadKey();

        }

        private  static void DoWork(object obj)
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值