예제 #1
0
 public void MarkAsDelivered()
 {
     if (_promise.TrySetResult(0))
     {
         Delivered?.Invoke(this, EventArgs.Empty);
     }
 }
예제 #2
0
        /// <summary>
        /// Метод, осуществляет доставку материала до конца конвейера и вызывает внешний метод при завершении доставки
        /// </summary>
        private async Task OnDelivered(ushort uid, Delivered delivered)
        {
            if (Speed == 0)
            {
                logger.Error($"Не установлена скорость перемещения для конвейера {ConveyorId}");
                throw new DivideByZeroException($"Не установлена скорость перемещения для конвейера {ConveyorId}");
            }

            List <Material> material = new List <Material>();

            foreach (KeyValuePair <ushort, List <Material> > _material in Material)
            {
                if (_material.Key == uid)
                {
                    material = _material.Value;
                    break;
                }
            }

            double delay = (Math.Round(Length / Speed, 0)) * 1000;
            await Task.Delay(TimeSpan.FromMilliseconds(delay));

            delivered?.Invoke(material);

            Material.Remove(uid);
            MaterialCount = Material.Count;
            Status        = Status.Delivered;
        }
예제 #3
0
        public void OnDelivered()
        {
            if (notified)
            {
                throw new InvalidOperationException("this token as already been notified");
            }
            notified = true;

            Delivered?.Invoke();
        }
예제 #4
0
        internal void Notify(bool delivered)
        {
            if (notified)
            {
                throw new InvalidOperationException("this token as already been notified");
            }
            notified = true;

            if (delivered)
            {
                Delivered.Invoke();
            }
            else
            {
                Lost.Invoke();
            }
        }
예제 #5
0
        //процесс доставки заказчику
        public virtual bool Deliver(Purchase purchase, SynchronizationContext context)
        {
            bool CanDeliver = DeliveringThread == null || !DeliveringThread.IsAlive;

            //смотрим, может ли доставщик выполнить доставку
            if (CanDeliver)
            {
                lock (purchase)
                {
                    DeliveringThread = new Thread(() =>
                    {
                        Thread.Sleep(10000);
                        purchase.IsMade = true;  //теперь считаем заказ выполненным
                        context.Send(obj => Delivered?.Invoke(obj as Purchase, this), purchase);
                    });
                    DeliveringThread.Start();
                }
            }

            return(CanDeliver);
        }