using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; using ThreadState = System.Threading.ThreadState; namespace ConsoleApp1 { public class FrameTimer { static FrameTimer() { timerThread = new Thread(timerRun); timerThread.Start(); var GuardThread = new Thread(GuardFunc); GuardThread.Start(); } public static void SetInterval(IRunnable handler, TimeSpan timeout, string timerName = "Default", string id = "Default") { var timerRunner = new TimerRunner { ID = id, TimerName = timerName, StartTime = DateTime.Now, IRunning = handler, TimeOutSpan = timeout }; timerRunner.SetActionTime(); try { if (string.Equals("Default", id, StringComparison.OrdinalIgnoreCase)) { addTimer(timerRunner); } else { var timeritem = getTimer(id); if (timeritem == null) { addTimer(timerRunner); } else { throw new Exception("当前任务已经存在"); } } } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); } } static void addTimer(TimerRunner timeritem) { try { _LockSlim.AcquireWriterLock(TimeSpan.FromSeconds(5)); timerRunners.Add(timeritem); } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); } finally { _LockSlim.ReleaseWriterLock(); } } /// <summary> /// 按ID查询任务 /// </summary> /// <param name="id"></param> /// <returns></returns> static TimerRunner getTimer(string id) { try { _LockSlim.AcquireReaderLock(TimeSpan.FromSeconds(5)); var timeritem = timerRunners.FirstOrDefault(t => string.Equals(t.ID, id, StringComparison.OrdinalIgnoreCase)); return timeritem; } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); return null; } finally { _LockSlim.ReleaseReaderLock(); } } static void RemoveJob(TimerRunner timeritem) { try { _LockSlim.AcquireWriterLock(TimeSpan.FromSeconds(5)); timerRunners.Remove(timeritem); } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); } finally { _LockSlim.ReleaseWriterLock(); } } /// <summary> /// 按ID停止任务 /// </summary> /// <param name="id"></param> /// <returns></returns> public static Tuple<bool, string> StopJob(string id) { if (string.Equals("Default", id, StringComparison.OrdinalIgnoreCase)) { return new Tuple<bool, string>(false, "无法停止默认任务"); } var timeritem = getTimer(id); if (timeritem == null) { return new Tuple<bool, string>(false, "无法停止不存在任务"); } else { try { RemoveJob(timeritem); var tp = new Tuple<bool, string>(true, "停止任务成功"); return tp; } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); } } return null; } /// <summary> /// 任务集合 /// </summary> static readonly List<TimerRunner> timerRunners = new List<TimerRunner>(); /// <summary> /// /// </summary> private static ReaderWriterLock _LockSlim = new ReaderWriterLock(); // SetInterval(handler, timeout, starttime, endtime) private static Thread timerThread; private static void timerRun() { while (true) { try { Thread.Sleep(TimeSpan.FromMilliseconds(500)); } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); } try { _LockSlim.AcquireReaderLock(TimeSpan.FromSeconds(5)); foreach (var timerRunner in timerRunners) { var now = DateTime.Now; if (timerRunner.ActionTime != null) { var timeUntilTrigger = timerRunner.ActionTime - now; if (timeUntilTrigger <= TimeSpan.Zero) { //执行 Task.Run(() => { try { timerRunner.IRunning.Run(); } catch (Exception ex) { #region 移除发生异常任务 try { RemoveJob(timerRunner); } catch (Exception exception) { Debug.WriteLine(exception.StackTrace); } #endregion Debug.WriteLine(ex.StackTrace); } }); timerRunner.SetActionTime(); } } } } finally { _LockSlim.ReleaseReaderLock(); } } } private static void GuardFunc() { while (true) { try { Thread.Sleep(TimeSpan.FromSeconds(10)); if (timerThread.ThreadState != ThreadState.Running && timerThread.ThreadState != ThreadState.WaitSleepJoin) { if (timerThread.ThreadState == ThreadState.Stopped || timerThread.ThreadState == ThreadState.Aborted) { timerThread.Abort(); Console.WriteLine(timerThread.ThreadState); timerThread = new Thread(timerRun); timerThread.Start(); } } Thread.Sleep(TimeSpan.FromSeconds(1)); int n = 0; foreach (ProcessThread th in Process.GetCurrentProcess().Threads) { Debug.WriteLine(th.ThreadState); if (th.ThreadState == System.Diagnostics.ThreadState.Running) { n++; } } Debug.WriteLine(n); } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); } } } } public class TimerRunner { public IRunnable IRunning { get; set; } public string TimerName { get; set; } public string ID { get; set; } public TimeSpan TimeOutSpan { get; set; } public DateTime StartTime { get; set; } public DateTime? EndTime { get; set; } public DateTime? ActionTime { get; set; } public void SetActionTime() { var actionTime = DateTime.Now + TimeOutSpan; if (GetActionTimeOut(actionTime)) { ActionTime = actionTime; } else { ActionTime = null; } } /// <summary> /// 判断是否超时 /// </summary> /// <param name="actionTime"></param> /// <returns></returns> public bool GetActionTimeOut(DateTime actionTime) { if (EndTime != null) { if (actionTime <= EndTime) { return true; } else { return false; } } else { return true; } } } public interface IRunnable { void Run(); } }