private void ReadArchivesDataFromControllers()
        {
            var waitCounter    = new WaitableCounter();
            var iterationPause = TimeSpan.FromMilliseconds(500);

            while (true)
            {
                try {
                    foreach (var info in _availableInfos)
                    {
                        var nowTime = DateTime.Now.RoundToLatestHalfAnHour();
                        var objName = info.Name;

                        Log.Log("Работа с объектом " + objName + ", текущее время = " + nowTime.ToSimpleString());
                        AsyncRecurseArchiveReadMethod(objName, waitCounter);
                    }

                    waitCounter.WaitForCounterChangeWhileNotPredecate(c => c == 0);
                    Log.Log("Все команды были выполнены, пауза " + iterationPause.TotalSeconds.ToString("f2") + " секунд...");
                    Thread.Sleep((int)iterationPause.TotalMilliseconds);
                }
                catch (Exception ex) {
                    Log.Log(ex.ToString());
                }
            }
        }
Example #2
0
        public PrivateThreadPool(int maxThreads, bool useFXThreadPool)
        {
            if (maxThreads < MinimumCount || maxThreads > MaximumCount)
            {
                throw new ArgumentOutOfRangeException("maxThreads", "must be between " + MinimumCount.ToString() + " and " + MaximumCount.ToString() + " inclusive");
            }

            this.counter        = new WaitableCounter(maxThreads);
            this.useFXTheadPool = useFXThreadPool;
        }
Example #3
0
        public AsyncUdpClient(string targetIp, int targetPort, int localPort, int connectionDropPeriodMs)
        {
            _targetIp       = targetIp;
            _targetPort     = targetPort;
            _targetEndpoint = new IPEndPoint(IPAddress.Parse(_targetIp), _targetPort);

            _localPort            = localPort;
            _connectionDropTimeMs = connectionDropPeriodMs;
            _connectionCounter    = new WaitableCounter();

            _notifyThreadWorker = new SingleThreadedRelayQueueWorkerProceedAllItemsBeforeStopNoLog <Action>("AsyncUDPClientBackThread", a => a(), ThreadPriority.Normal, true, null); // Нотификатор получения данных

            EstablishNewConnection();

            _dropConnectionWachdog = new Thread(WatchForConnectionDropFunc)
            {
                IsBackground = true, Priority = ThreadPriority.BelowNormal, Name = "ConnectionDropWachdog"
            };
            _dropConnectionWachdog.Start();
        }
        private void AsyncRecurseArchiveReadMethod(string objName, WaitableCounter sharedTasksCounter)
        {
            Log.Log("Рекурсивное чтение архивов для " + objName);
            var      nowTime   = DateTime.Now;
            DateTime?timeToGet = _storage.GetFirstMissedTimeUpToTime(objName, nowTime);

            if (timeToGet.HasValue)
            {
                var time = timeToGet.Value;
                var cmd  = new ReadArchiveRecordServiceCommand(time);
                Log.Log("Есть архивы, которые нужно вычитать. Имя объекта=" + objName + "   Команда=<" + cmd.Comment + ">   Время=" + cmd.RequestedTime.ToSimpleString() + " Арх.№=" + cmd.RecordNumber);

                sharedTasksCounter.IncrementCount();
                _bumizIoManager.SendDataAsync(objName, cmd, result => {
                    try {
                        Log.Log("Асинхронный запрос к сети БУМИЗ выполнен для объекта " + objName);
                        if (result != null)
                        {
                            if (result.ChannelException == null)
                            {
                                Log.Log(result.Bytes.ToText() + " <= для времени = " + time.ToSimpleString() + " Арх.№=" + cmd.RecordNumber);
                                try {
                                    var ctResult = cmd.GetResult(result.Bytes);
                                    Log.Log(ctResult.ToString());
                                    if (ctResult.RecordTime.Date == time.Date)
                                    {
                                        Log.Log("Даты совпадают, сохраняем данные в хранилище");
                                        _storage.SaveData(objName, time, true, ctResult.Count1, ctResult.Count2, ctResult.Count3, ctResult.Status, ctResult.Xstatus);
                                    }
                                    else
                                    {
                                        throw new Exception("Дата внутри архива не совпадает с датой запроса");
                                    }
                                }
                                catch (Exception ex) {
                                    Log.Log("Ошибка обработки ответа БУМИЗ, в хранилище будет записана информация о плохой записи архива");
                                    Log.Log("Причина - исключение: " + ex.ToString());
                                    _storage.SaveData(objName, time, false, 0, 0, 0, 0, 0);
                                }
                                finally {
                                    AsyncRecurseArchiveReadMethod(objName, sharedTasksCounter);
                                }
                            }
                            else
                            {
                                Log.Log("Ошибка канала передачи данных: " + result.ChannelException.ToString());
                                Log.Log("Объект " + objName + " больше не будет опрашиваться в этой итерации (пока все остальные не закончат свои обмены)");
                                // Получается, что при ошибке передачи данных следующий запрос не будет осуществлен, и объект выпадает из цикла опроса, пока другие объекты не закончат свои работы
                            }
                        }
                        else
                        {
                            Log.Log("Результат выполнения операции не существует, странно :О");
                        }
                    }
                    catch (Exception ex) {
                        Log.Log("Произошла ошибка при разборе ответа от объекта " + objName);
                        Log.Log(ex.ToString());
                        // TODO: что делать при ошибке чтения данных (нет связи с FRAM)?
                    }
                    finally {
                        Log.Log("Декремент счетчика задач сети БУМИЗ для объекта " + objName);
                        sharedTasksCounter.DecrementCount();
                    }
                }, IoPriority.Low);
            }
            else
            {
                Log.Log("Либо ошибка хранилища, либо для объекта " + objName + " все данные вычитаны");
            }
        }