public void AddTask(BaseTimedTask task) { lock (this._locker) { if (task.TimeInterval < 0) { task.ExecuteTick = task.NeedExecuteAtTime.Ticks; } else { task.ExecuteTick = DateTime.Now.Ticks + task.TimeInterval * TimeSpan.TicksPerMillisecond; } while (true) { if (this._tasks.ContainsKey(task.ExecuteTick)) { task.ExecuteTick++; } else { this._tasks.Add(task.ExecuteTick, task); break; } } if (this._tasks.Count == 1) { this._workerdWait.Set(); } } }
private void worker(object state) { this._workerdWait = new AutoResetEvent(true); while (!_needStop) { if (this._tasks.Count == 0) { this._workerdWait.WaitOne(_stepSize); continue; } DateTime now = DateTime.Now; TimeSpan wait = new TimeSpan(100); lock (this._locker) { if (this._tasks.Count == 0) { continue; } BaseTimedTask task = this._tasks.Values.First(); if (task.RemoveTask) //запрос на удаление задачи { this._tasks.Remove(task.ExecuteTick); continue; } if (task.ExecuteTick < now.Ticks) //задача на выполнение { this._tasks.Remove(task.ExecuteTick); task.ExecutedTick = now.Ticks; Task.Run(() => { this.saveExecutor(task); }); continue; } //время еще не пошло, ожидаем wait = new TimeSpan(task.ExecuteTick - now.Ticks); if (wait > _stepSize) { wait = _stepSize; } } this._workerdWait.WaitOne(wait); } }
private void saveExecutor(BaseTimedTask task) { try { task.Execute(); } catch (Exception e) { this._logger.Error(e, "TaskDispatcher cant execute task"); } }