public bool GetGoods(Storage Storage) { if (Storage.GetGoods() != null) return true; else return false; }
// Задача для потока перемещения с 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)); } }); }
public bool MoveGoods(Storage TakeStorage, Storage PlaceStorage) { Goods myTovar = TakeStorage.GetGoods(); if (myTovar != null) { PlaceStorage.AddGoods(myTovar); return true; } else return false; }
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()); // Утверждение }
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, "Товар не получен!"); }
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, "Количество товара не увеличивается!"); }
// Построитель потоков 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()); }
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); }
// Задача, "Производители" отдают товар на 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)); } }); }
// Задача для потока "потребителей" 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)); } }); }
public void PlaceStorage(Storage Storage) { Storage.AddGoods(myTovar = new Goods()); }