public void RemoveBackgroundTask(BackgroundTask task) { lock (_obj) { BackgroundTaskList.Remove(task); Log("删除"); } }
public void RunBackgroundTask(BackgroundTask task) { lock (_obj) { if (BackgroundTaskList.Contains(task)) { throw new ArgumentException("不能传入重复的任务"); } BackgroundTaskList.Add(task); Log("添加任务 " + task.Name); // 如果线程还没启动,调用下面代码就启动线程,如果已经启动了,调用下面代码也没事 Start(); } }
private void Run() { try { int waitCount = 0; const int waitToExit = 12; while (waitCount < waitToExit) { List <BackgroundTask> backgroundTaskList; lock (_obj) { backgroundTaskList = BackgroundTaskList.ToList(); } if (backgroundTaskList.Count == 0) { Console.WriteLine("没有任务自己暂停一下" + waitCount); if (waitCount < WaitDelayTimeList.Length) { Thread.Sleep(WaitDelayTimeList[waitCount]); waitCount++; } else { Thread.Sleep(MaxDelayTime); waitCount++; } continue; } waitCount = 0; var minDelayTime = TimeSpan.MaxValue; foreach (var backgroundTask in backgroundTaskList) { var lastTime = (DateTime.Now - backgroundTask.LastStartTime); if (lastTime >= backgroundTask.DelayTime) { backgroundTask.Action(); Console.WriteLine( $"{DateTime.Now} {DateTime.Now.Millisecond} 运行 {backgroundTask.Name} 距离上次运行 {(lastTime).Milliseconds} 误差{lastTime.Milliseconds - backgroundTask.DelayTime.Milliseconds}"); backgroundTask.LastStartTime = DateTime.Now; var delayTime = backgroundTask.DelayTime; if (delayTime < minDelayTime) { minDelayTime = delayTime; } } else { var delayTime = backgroundTask.DelayTime - (DateTime.Now - backgroundTask.LastStartTime); if (delayTime < minDelayTime) { minDelayTime = delayTime; } } } if (minDelayTime > MaxDelayTime) { minDelayTime = MaxDelayTime; } else if (minDelayTime < MinDelayTime) { minDelayTime = MinDelayTime; } Thread.Sleep(minDelayTime); } } finally { lock (_obj) { _thread = null; } Log("退出线程"); } }