在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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); } }
|
请发表评论