private void MessageFromGroundService() { mqClient.SubscribeTo <ServiceCommand>(queueFromGroundService, (sc) => { Console.WriteLine(DateTime.Now + " " + Component.Deicing + " Получил сообщение от СНО"); DeicingCar car = SearchFreeCar(); Console.WriteLine($"нашли свободную машину {car.DeicingCarID}"); Task t = new Task(() => { //приехать к самолёту GoPath(GoToVertexAlone, car, sc.PlaneLocationVertex); Console.WriteLine($"{DateTime.Now} {car.DeicingCarID} приехала к самолёту"); //чистим самолёт от льда WorkWithPlane(sc.PlaneId); Console.WriteLine($"{DateTime.Now} {car.DeicingCarID} почистила самолёт"); ServiceCompletionMessage deicingCompletion = new ServiceCompletionMessage() { PlaneId = sc.PlaneId, Component = Component.Deicing }; mqClient.Send <ServiceCompletionMessage>(queueToGroundService, deicingCompletion); Console.WriteLine($"{DateTime.Now} {car.DeicingCarID} отправила сообщение СНО"); var source = new CancellationTokenSource(); //adds token and remove it after went home/new cmd tokens.TryAdd(car.DeicingCarID, source); //уезжаем на стоянку GoPathHome(car, RandomHomeVertex.GetHomeVertex(), tokens[car.DeicingCarID]); if (!tokens[car.DeicingCarID].IsCancellationRequested) //если не было отмены пути домой { Console.WriteLine($"{DateTime.Now} {car.DeicingCarID} приехала домой"); } tokens.Remove(car.DeicingCarID, out source); }); carTasks.TryAdd(car.DeicingCarID, t); t.Start(); }); }
//C СЛУЖБОЙ НАЗЕМНОГО ОБСЛУЖИВАНИЯ private void MessageFromGroundService() //забрать/сдать багаж на самолет { mqClient.SubscribeTo <BaggageServiceCommand>(queueFromGroundService, (bsc) => { Console.WriteLine(DateTime.Now + " " + Component.Baggage + " Получил сообщение от СНО"); new Task(() => { int numOfCars = bsc.BaggageCount / BaggageCar.MaxCountOfBaggage; //сколько машин нужно выделить под задачу if ((bsc.BaggageCount % BaggageCar.MaxCountOfBaggage) > 0) { numOfCars++; } Console.WriteLine($"{bsc.BaggageCount} багажа нужно"); Console.WriteLine(numOfCars + " машин нужно для задачи"); int carsEndWork = numOfCars; if (bsc.Action == TransferAction.Give) { for (int i = 0; i < numOfCars; i++) { Console.WriteLine("ищем свободную машину"); BaggageCar car = SearchFreeCar(); Console.WriteLine($"нашли {car.BaggageCarID} "); Task t = new Task(() => { //поехать к накопителю GoPath(GoToVertexAlone, car, storageVertex); Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к накопителю"); ToStorageRequest(car.BaggageCarID, bsc.FlightId, BaggageCar.MaxCountOfBaggage); Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} запросила багаж у накопителя"); //поехать к самолёту GoPath(GoToVertexAlone, car, bsc.PlaneLocationVertex); Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к самолёту"); //отдаём багаж самолёту sourceDelay.CreateToken().Sleep(2 * 60 * 1000); //отдаём багаж 15 минут TakeOrGiveBaggageFromPlane(bsc.PlaneId, car.BaggageCarID, TransferAction.Give, car.CountOfBaggage); car.CountOfBaggage = 0; Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} отдала багаж самолёту"); carsEndWork--; //машина обслужила самолёт var source = new CancellationTokenSource(); //adds token and remove it after went home/new cmd tokens.TryAdd(car.BaggageCarID, source); //вернуться на стоянку GoPathHome(car, RandomHomeVertex.GetHomeVertex(), tokens[car.BaggageCarID]); tokens.Remove(car.BaggageCarID, out source); }); carTasks.TryAdd(car.BaggageCarID, t); t.Start(); } } else if (bsc.Action == TransferAction.Take) { for (int i = 0; i < numOfCars; i++) { BaggageCar car = SearchFreeCar(); Task t = new Task(() => { //поехать к самолёту GoPath(GoToVertexAlone, car, bsc.PlaneLocationVertex); Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к самолёту"); sourceDelay.CreateToken().Sleep(2 * 60 * 1000); //забираем багаж 15 минут TakeOrGiveBaggageFromPlane(bsc.PlaneId, car.BaggageCarID, TransferAction.Take, car.CountOfBaggage); Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} забрала багаж у самолёта"); carsEndWork--; //машина обслужила самолёт //поехать к накопителю (багаж отдавать не надо) GoPath(GoToVertexAlone, car, storageVertex); car.CountOfBaggage = 0; Console.WriteLine($"{DateTime.Now} {car.BaggageCarID} приехала к накопителю"); var source = new CancellationTokenSource(); //adds token and remove it after went home/new cmd tokens.TryAdd(car.BaggageCarID, source); //едем на стоянку GoPathHome(car, RandomHomeVertex.GetHomeVertex(), tokens[car.BaggageCarID]); tokens.Remove(car.BaggageCarID, out source); }); carTasks.TryAdd(car.BaggageCarID, t); t.Start(); } } //ждём, пока все машины не завершат работу while (carsEndWork != 0) { sourceDelay.CreateToken().Sleep(100); } //отправляем СНО сообщение о том, что обслуживание самолёта завершено ServiceCompletionMessage mes = new ServiceCompletionMessage() { Component = Component.Baggage, PlaneId = bsc.PlaneId }; mqClient.Send <ServiceCompletionMessage>(queueToGroundService, mes); Console.WriteLine($"{DateTime.Now} завершено обслуживание самолёта"); }).Start(); }); }