コード例 #1
0
 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);
             }
         }
     }
 }
コード例 #2
0
        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);
                }
            }
        }