public async Task Start() { //ЗАПУСК СЛУШАТЕЛЯ ДЛЯ ТЕРМИНАЛОВ---------------------------------------------------------- if (Listener != null) { var taskListener = Listener.RunServer(ProviderTerminal); BackGroundTasks.Add(taskListener); } //ЗАПУСК ОПРОСА КАССИРОВ------------------------------------------------------------------- if (MasterSerialPorts.Any()) { foreach (var sp in MasterSerialPorts) { var taskSerialPort = Task.Factory.StartNew(async() => { if (await sp.CycleReConnect()) { var taskCashierEx = sp.RunExchange(); BackGroundTasks.Add(taskCashierEx); } }); BackGroundTasks.Add(taskSerialPort); } } //КОНТРОЛЬ ФОНОВЫХ ЗАДАЧ---------------------------------------------------------------------- var taskFirst = await Task.WhenAny(BackGroundTasks); if (taskFirst.Exception != null) //критическая ошибка фоновой задачи { ErrorString = taskFirst.Exception.ToString(); } }
public void LoadSetting() { //ЗАГРУЗКА НАСТРОЕК---------------------------------------------------------------- XmlListenerSettings xmlListener; IList <XmlSerialSettings> xmlSerials; List <XmlCashierSettings> xmlCashier; List <XmlQueuesSettings> xmlQueues; try { var xmlFile = XmlWorker.LoadXmlFile("Settings", "Setting.xml"); //все настройки в одном файле if (xmlFile == null) { return; } xmlListener = XmlListenerSettings.LoadXmlSetting(xmlFile); xmlSerials = XmlSerialSettings.LoadXmlSetting(xmlFile).ToList(); xmlCashier = XmlCashierSettings.LoadXmlSetting(xmlFile); xmlQueues = XmlQueuesSettings.LoadXmlSetting(xmlFile); } catch (FileNotFoundException ex) { ErrorString = ex.ToString(); return; } catch (Exception ex) { ErrorString = "ОШИБКА в узлах дерева XML файла настроек: " + ex; return; } //РАЗРЕШИТЬ ЛОГГИРОВАНИЕ----------------------------------------------------------- Log.EnableLogging(true); //СОЗДАНИЕ ОЧЕРЕДИ----------------------------------------------------------------------- foreach (var xmlQueue in xmlQueues) { var queue = new QueuePriority(xmlQueue.Name, xmlQueue.Prefixes); QueuePriorities.Add(queue); } //СОЗДАНИЕ СЛУШАТЕЛЯ ДЛЯ ТЕРМИНАЛОВ------------------------------------------------------- Listener = new ListenerTcpIp(xmlListener); ProviderTerminal = new Server2TerminalExchangeDataProvider(isSynchronized: true); ProviderTerminal.PropertyChanged += (o, e) => { var provider = o as Server2TerminalExchangeDataProvider; if (provider != null) { if (e.PropertyName == "InputData") { try { provider.OutputData = provider.OutputData ?? new TerminalOutData(); //Найдем очередь к которой обращен запрос var prefixQueue = provider.InputData.PrefixQueue; var nameQueue = provider.InputData.NameQueue; var queue = QueuePriorities.FirstOrDefault(q => string.Equals(q.Name, nameQueue, StringComparison.InvariantCultureIgnoreCase)); if (queue == null) { return; } switch (provider.InputData.Action) { //ИНФОРМАЦИЯ ОБ ОЧЕРЕДИ case TerminalAction.Info: provider.OutputData.PrefixQueue = provider.InputData.PrefixQueue; provider.OutputData.CountElement = (ushort)queue.GetInseartPlace(prefixQueue); provider.OutputData.NumberElement = (ushort)(queue.GetCurrentTicketNumber + 1); provider.OutputData.AddedTime = DateTime.Now; break; //ДОБАВИТЬ БИЛЕТ В ОЧЕРЕДЬ case TerminalAction.Add: var ticket = queue.CreateTicket(prefixQueue); provider.OutputData.PrefixQueue = provider.InputData.PrefixQueue; provider.OutputData.CountElement = ticket.CountElement; provider.OutputData.NumberElement = (ushort)ticket.NumberElement; provider.OutputData.AddedTime = ticket.AddedTime; queue.Enqueue(ticket); var logMessage = $"ДОБАВИТЬ БИЛЕТ В ОЧЕРЕДЬ (команда от терминала): {ticket.ToString()} "; _logQueueInput.Info(logMessage); break; } } catch (Exception ex) { _logQueueInput.Error($"Server2TerminalExchangeDataProvider: {ex.ToString()}"); } } } }; //DEBUG------ИНИЦИАЛИЗАЦИЯ ОЧЕРЕДИ--------------------- //Обязательно коментировать _model.LoadStates(); иначе состояние очереди затрется //var queueTemp = QueuePriorities.FirstOrDefault(q => string.Equals(q.Name, "Main", StringComparison.InvariantCultureIgnoreCase)); //var queueAdmin = QueuePriorities.FirstOrDefault(q => string.Equals(q.Name, "Admin", StringComparison.InvariantCultureIgnoreCase)); //for (int i = 0; i < 200; i++) //{ // var ticketAdmin = queueTemp.CreateTicket("А"); // queueAdmin.Enqueue(ticketAdmin); // var ticket = queueTemp.CreateTicket("К"); // queueTemp.Enqueue(ticket); // ticket = queueTemp.CreateTicket("К"); // queueTemp.Enqueue(ticket); // ticket = queueTemp.CreateTicket("Г"); // queueTemp.Enqueue(ticket); // ticket = queueTemp.CreateTicket("И"); // queueTemp.Enqueue(ticket); // ticket = queueTemp.CreateTicket("С"); // queueTemp.Enqueue(ticket); //} //DEBUG---------------------------------------------- //СОЗДАНИЕ КАССИРОВ------------------------------------------------------------------------------------------------ foreach (var xmlCash in xmlCashier) { var queue = QueuePriorities.FirstOrDefault(q => q.Name == xmlCash.NameQueue); if (queue != null) { var logName = "Server.CashierInfo_" + xmlCash.Port; var casher = new Сashier(xmlCash.Id, xmlCash.Prefixs, queue, xmlCash.MaxCountTryHanding, logName); DeviceCashiers.Add(new DeviceCashier(xmlCash.AddressDevice, casher, xmlCash.Port)); } } AdminCasher = DeviceCashiers.FirstOrDefault(d => d.Cashier.Prefixes.Contains("А")); //СОЗДАНИЕ ПОСЛЕД. ПОРТА ДЛЯ ОПРОСА КАССИРОВ----------------------------------------------------------------------- var cashersGroup = DeviceCashiers.GroupBy(d => d.Port).ToDictionary(group => group.Key, group => group.ToList()); //принадлежность кассира к порту foreach (var xmlSerial in xmlSerials) { var logName = "Server.CashierInfo_" + xmlSerial.Port; var sp = new MasterSerialPort(xmlSerial, logName); var cashiers = cashersGroup[xmlSerial.Port]; var cashierExch = new CashierExchangeService(cashiers, AdminCasher, xmlSerial.TimeRespoune, logName); sp.AddFunc(cashierExch.ExchangeService); //sp.PropertyChanged += (o, e) => // { // var port = o as MasterSerialPort; // if (port != null) // { // if (e.PropertyName == "StatusString") // { // ErrorString = port.StatusString; //TODO: РАЗДЕЛЯЕМЫЙ РЕСУРС возможно нужна блокировка // } // } // }; MasterSerialPorts.Add(sp); CashierExchangeServices.Add(cashierExch); } }