예제 #1
0
 public bool GetGoods(Storage Storage)
 {
     if (Storage.GetGoods() != null)
         return true;
     else
         return false;
 }
예제 #2
0
        // Задача для потока перемещения с 1 склада на 2
        private Task LogisticAsync(Storage Sklad1, Storage Sklad2, int ChainLength)
        {
            return Task.Run(() =>
            {
                Logistic myLogistic = new Logistic();
                for (int i = 0; i < ChainLength; i++)
                {
                    try
                    {
                        if (myLogistic.MoveGoods(Sklad1, Sklad2))
                            Console.WriteLine("На склад 2, поток - {0}, проход - {1}", Thread.CurrentThread.ManagedThreadId, i);
                        else
                            Console.WriteLine("На складе 1 нет товара!!! Поток - {0}, проход - {1}", Thread.CurrentThread.ManagedThreadId, i);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Исключение склад 2: " + ex.Message);
                    }

                    // Имитация произвольных обращений
                    Random rnd = new Random();
                    Thread.Sleep(rnd.Next(0, 1000));
                }
            });
        }
예제 #3
0
 public bool MoveGoods(Storage TakeStorage, Storage PlaceStorage)
 {
     Goods myTovar = TakeStorage.GetGoods();
     if (myTovar != null)
     {
         PlaceStorage.AddGoods(myTovar);
         return true;
     }
     else
         return false;
 }
예제 #4
0
        public void AddGoods_MoreThanTheMaximumAmount_QuantityDoesNotIncrease()     // При добавлении товара количество не должно привышать максимума
        {
            // Организация
            int myMaxGoods = 2;
            Storage myStorage = new Storage(myMaxGoods, "SkladTest");
            Goods myTovar;

            // Действие
            for (int i = 1; i < myMaxGoods + 2; i++)
                myStorage.AddGoods(myTovar = new Goods());

            // Утверждение
        }
예제 #5
0
        public void GetGoods_GetTheGoods_TheResultingProductIsIndoors() // Получение товара товара
        {
            // Организация
            int myMaxGoods = 10;
            Storage myStorage = new Storage(myMaxGoods, "SkladTest");
            Goods expected = new Goods();

            // Действие
            myStorage.AddGoods(expected);

            // Утверждение
            Goods actual = myStorage.GetGoods();
            Assert.AreEqual(expected, actual, "Товар не получен!");
        }
예제 #6
0
        public void AddGoods_AddGoods_IncreasingTheNumberGoods() // При добавлении количество увеличивается на 1
        {
            // Организация
            int myMaxGoods = 10;
            Storage myStorage = new Storage(myMaxGoods, "SkladTest");
            Goods myTovar;
            int expected = myStorage.GetCount() + 1;

            // Действие
            myStorage.AddGoods(myTovar = new Goods());

            // Утверждение
            int actual = myStorage.GetCount();
            Assert.AreEqual(expected, actual, 0, "Количество товара не увеличивается!");
        }
예제 #7
0
        // Построитель потоков
        public async Task ResultManufacturerAsync(Storage Sklad1, Storage Sklad2, int ChainLength, 
            int ThreadsManufactur, int ThreadsLogist, int ThreadsConsumer)
        {
            Task[] myTask = new Task[ThreadsManufactur + ThreadsLogist + ThreadsConsumer];  // Масив всех потоков
            RndArray(myTask);

            for (int i = 0; i < ThreadsManufactur; i++)
                myTask[i] = ManufacturerAsync(Sklad1, ChainLength);                         // Производители

            for (int i = ThreadsManufactur; i < ThreadsManufactur + ThreadsLogist; i++)
                myTask[i] = LogisticAsync(Sklad1, Sklad2, ChainLength);                     // Логисты

            for (int i = ThreadsManufactur + ThreadsLogist; i < ThreadsManufactur + ThreadsLogist + ThreadsConsumer; i++)
                myTask[i] = ConsumerAsync(Sklad2, ChainLength);                             // Покупатели

            await Task.WhenAll(myTask);     // Запуск всех потоков

            Console.WriteLine();
            Console.WriteLine("На 1 складе осталось {0} шт. товара:", Sklad1.GetCount());
            Console.WriteLine("На 2 складе осталось {0} шт. товара:", Sklad2.GetCount());
        }
예제 #8
0
        private static int myMaxGoods           = 10;   // Объем склада

        static void Main(string[] args)
        {
            try
            {
                myChainLength       = int.Parse(ConfigurationManager.AppSettings[0]);
                myThreadsManufactur = int.Parse(ConfigurationManager.AppSettings[1]);
                myThreadsLogist     = int.Parse(ConfigurationManager.AppSettings[2]);
                myThreadsConsumer   = int.Parse(ConfigurationManager.AppSettings[3]);
                myMaxGoods          = int.Parse(ConfigurationManager.AppSettings[4]);
            }
            catch
            {
                Console.WriteLine("Ошибка чтения параметров! Будут применены параметры по умолчанию");
            }

            try
            {
                using (Storage mySklad1 = new Storage(myMaxGoods, "Sklad1"), mySklad2 = new Storage(myMaxGoods, "Sklad2"))
                {
                    FlowControlAsync myClassAsync = new FlowControlAsync(); // Клас потоков

                    Console.WriteLine("На складе 1 товар в количестве: {0} шт.", mySklad1.GetCount());
                    Console.WriteLine("На складе 2 товар в количестве: {0} шт.", mySklad2.GetCount());
                    Console.WriteLine();

                    // Вызов построителя потоков
                    Task task = myClassAsync.ResultManufacturerAsync(mySklad1, mySklad2, myChainLength, myThreadsManufactur,
                        myThreadsLogist, myThreadsConsumer);
                    task.Wait();
                }
        }
            catch (Exception ex)
            {
                Console.WriteLine("Исключение при работе: " + ex.Message);
            }

    Console.WriteLine("Press any key to continue . . . ");
            Console.ReadKey(true);
        }        
예제 #9
0
        // Задача, "Производители" отдают товар на 1 склад
        private Task ManufacturerAsync(Storage Sklad, int ChainLength)
        {
            return Task.Run(() =>
            {
                Manufacturer myManufacturer = new Manufacturer();
                for (int i = 0; i < ChainLength; i++)
                {
                    try
                    {
                        myManufacturer.PlaceStorage(Sklad);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Исключение склад 1: " + ex.Message);
                    }

                    Console.WriteLine("На склад 1, поток - {0}, проход - {1}", Thread.CurrentThread.ManagedThreadId, i);
                    
                    // Имитация произвольных обращений
                    Random rnd = new Random();
                    Thread.Sleep(rnd.Next(0, 1000));
                }
            });
        }
예제 #10
0
 // Задача для потока "потребителей"
 private Task ConsumerAsync(Storage Sklad2, int ChainLength)
 {
     return Task.Run(() =>
     {
         Consumer myConsumer = new Consumer();
         for (int i = 0; i < ChainLength; i++)
         {
             if (myConsumer.GetGoods(Sklad2))
                 Console.WriteLine("На продажу поток - {0}, проход - {1}", Thread.CurrentThread.ManagedThreadId, i);
             else
                 Console.WriteLine("На складе 2 нет товара!!! Поток - {0}, проход - {1}", Thread.CurrentThread.ManagedThreadId, i);
             
             // Имитация произвольных обращений
             Random rnd = new Random();
             Thread.Sleep(rnd.Next(0, 1000));
         }
     });
 }
예제 #11
0
 public void PlaceStorage(Storage Storage)
 {
     Storage.AddGoods(myTovar = new Goods());
 }