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()); } } }
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; }
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 + " все данные вычитаны"); } }