Esempio n. 1
0
        /// <summary>
        /// Метод <see cref="Enter"/> вызывается перед тем, как поток начнет использовать уравляемый ресурс.
        /// Метод не выполняется до тех пор пока управляемый ресур не освободиться и объект <see cref="Sheduler"/>
        /// не примет решение, что подошла очередь выполнения этого запроса
        /// </summary>
        /// <param name="s"></param>
        public void Enter(ISchedulerOrdering s)
        {
            var thisThread = Thread.CurrentThread;

            lock (this)
            {
                // Определяем не занят ли планировщик
                if (_runningThread == null)
                {
                    // Немедленно начинаем выполнение поступившего запроса
                    _runningThread = thisThread;
                    return;
                }
                _waiting.Add(thisThread, s);
            }

            lock (thisThread)
            {
                //Блокируем поток до тех пор, пока планировщик не решит сделать его текущим
                while (thisThread != _runningThread)
                {
                    _event.WaitOne();
                    _event.Set();   // даем возможность другим потокам проверить своё состояние
                    Thread.Sleep(1);
                }
                _event.Reset();
            }

            lock (this)
            {
                _waiting.Remove(thisThread);
            }
        }
Esempio n. 2
0
 public bool ScheduleBefore(ISchedulerOrdering s)
 {
     if (s is ImportTable)
     {
         ImportTable importTable = (ImportTable)s;
         return(this.Time < importTable.Time);
     }
     return(false);
 }