zoukankan      html  css  js  c++  java
  • c# 使用timer定时器操作,上次定时到了以后,下次还未执行完怎么处理

    c# 使用timer定时器操作,下次定时到了以后,上次还未执行完怎么办

    ------解决方案--------------------------------------------------------
    开始的时候,禁用定时器,你可以在执行完毕之后再启用定时器

    定时器定时执行某一个方法时,可能由于执行的时间长要比间隔的时间长,则这种情况可能导致线程并发性的问题。建议加上Lock
    private static object LockObject = new Object();
    private static void CheckUpdatetimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        // 加锁检查更新锁
       lock (LockObject)
       {
       }
    }
    // From command line, compile with /r:System.dll
    using System;
    using System.Timers;
    using System.Threading;

    public class Timer2
    {
        //static System.Windows.Forms.Timer aTimer = new System.Windows.Forms.Timer();

        private static System.Timers.Timer aTimer;
        static object o = new object();
        public static void Main()
        {
            // Normally, the timer is declared at the class level,
            
    // so that it stays in scope as long as it is needed.
            
    // If the timer is declared in a long-running method,  
            
    // KeepAlive must be used to prevent the JIT compiler 
            
    // from allowing aggressive garbage collection to occur 
            
    // before the method ends. (See end of method.)
            
    //System.Timers.Timer aTimer;

            
    // Create a timer with a ten second interval.
            aTimer = new System.Timers.Timer(2000);
            aTimer.Enabled = true;

            // Hook up the event handler for the Elapsed event.
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

            // Only raise the event the first time Interval elapses.
            aTimer.AutoReset = true;

            Console.WriteLine("Press the Enter key to exit the program.");
            Console.ReadLine();

            // If the timer is declared in a long-running method, use
            
    // KeepAlive to prevent garbage collection from occurring
            
    // before the method ends.
            
    //GC.KeepAlive(aTimer);
        }

        

        // Specify what you want to happen when the Elapsed event is 
        
    // raised.
        static object name=0;
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            //lock (o)
            {
                aTimer.Enabled = false;
                aTimer.Interval = 1000;
                lock(name)
                {
                    name = Convert.ToInt32(name) + 1;
                    Thread.CurrentThread.Name = name.ToString();
                }
                Console.WriteLine(DateTime.Now.ToString()+"-"+Thread.CurrentThread.Name);
                //Thread.Sleep(1000000);
                Waste();
                aTimer.Enabled = true
            }

        }

        /// <summary>
        
    /// 模拟长时间的操作
        
    /// </summary>
        public static void Waste()
        {
            for (int i = 0; i < Int32.MaxValue; i++)
            {
                
            }
            //Thread.Sleep(10000);
            Console.WriteLine(DateTime.Now.ToString()+"完成-"+Thread.CurrentThread.Name);
        }
    }
  • 相关阅读:
    【猫狗数据集】谷歌colab之使用pytorch读取自己数据集(猫狗数据集)
    【python-leetcode480-双堆】滑动窗口的中位数
    hadoop伪分布式之配置文件说明
    hadoop伪分布式之配置日志聚集
    hadoop伪分布式之配置历史服务器
    微服务框架-Spring Cloud
    Spring Cloud和eureka启动报错 解决版本依赖关系
    Spring Cloud提供者actuator依赖
    Eureka 客户端依赖管理模块
    JDK9之后 Eureka依赖
  • 原文地址:https://www.cnblogs.com/51net/p/3061231.html
Copyright © 2011-2022 走看看