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"); }
 }