public void Work() { while (true) { if (MainTray.Position < MainTray.Length) { if (Monitor.TryEnter(MainTray)) { for (int i = MainTray.Position; i < MainTray.Length; i++) { DrinkType drinkType = (DrinkType)(rng.Next(0, 2)); MainTray.PushToFirst(new Drink(drinkType)); ProcessInfo?.Invoke($"Drink producer has produced a {drinkType}"); Thread.Sleep(rng.Next(200, 500)); } Monitor.Pulse(MainTray); Monitor.Exit(MainTray); } } } }
public void Work() { while (true) { if (Monitor.TryEnter(MainTray)) { if (MainTray.Position > 0) { Drink drink = MainTray.Pull(); BufferTray <Drink> tray = GetTray(drink.Type); if (tray.Position < tray.Length) { if (Monitor.TryEnter(tray)) { tray.Push(drink); ProcessInfo?.Invoke($"{drink.Type} was splitted onto {drink.Type} tray"); Monitor.Pulse(tray); Monitor.Exit(tray); Thread.Sleep(rng.Next(50, 250)); } } else { MainTray.Push(drink); } } Monitor.Pulse(MainTray); Monitor.Exit(MainTray); } } }