private MonitoringClientFactory GetObjectsForAnalys(List <int> filterObjectsList, HashSet <int> uspds, HashSet <int> tis, DateTime dtStart, DateTime dtEnd, double?maxValue, bool isConcentratorsEnabled, bool isMetersEnabled, List <int> selectedEvents, List <byte> selectedСhannels) { var monitoringAnalyseResult = ARM_Service_.Monit_GetAnalyse(_типМодуля == Common.ModuleType.Monitoring61968, filterObjectsList, tis.ToList(), dtStart, dtEnd); if (monitoringAnalyseResult == null) { return(null); } if (monitoringAnalyseResult.Errors != null && monitoringAnalyseResult.Errors.Length > 0) { Manager.UI.ShowMessage(monitoringAnalyseResult.Errors.ToString()); } //Отфильтровываем ненужные УСПД if (uspds.Count > 0 && monitoringAnalyseResult.MonitoringAnalyseUSPD != null && monitoringAnalyseResult.MonitoringAnalyseUSPD.Count > 0) { var neededMonitoringAnalyses = new List <TMonitoringAnalyse>(); foreach (var monitoringAnalysisGroupByPs in monitoringAnalyseResult.MonitoringAnalyseUSPD.GroupBy(g => g.PS_ID ?? -1)) { //Если явно не задана ПС, то объект нужен в любом случае if (monitoringAnalysisGroupByPs.Key == -1) { neededMonitoringAnalyses.AddRange(monitoringAnalysisGroupByPs.Where(monitoringAnalysis => uspds.Contains(monitoringAnalysis.ID))); } else { //Если есть УСПД из этой ПС значит нужны только указанные УСПД neededMonitoringAnalyses.AddRange(monitoringAnalysisGroupByPs.Any(monitoringAnalysis => uspds.Contains(monitoringAnalysis.ID)) ? monitoringAnalysisGroupByPs.Where(monitoringAnalysis => uspds.Contains(monitoringAnalysis.ID)) : monitoringAnalysisGroupByPs); } } monitoringAnalyseResult.MonitoringAnalyseUSPD = neededMonitoringAnalyses; } //Для отмены cancellationTokenSource = new CancellationTokenSource(); CancellationToken cancellationToken = cancellationTokenSource.Token; _waiterId = Guid.NewGuid(); //Фактория клиента для получения и построения результата мониторинга var monitoringFactory = new MonitoringClientFactory ( dtStart, dtEnd, maxValue, isConcentratorsEnabled, isMetersEnabled, selectedEvents, selectedСhannels, _filterFlag, cancellationToken, progress, ShowTotalStatistic, _waiterId.Value, monitoringAnalyseResult, ModuleType ); //Ждем обработки на сервере //int daynumbers = (int) Math.Ceiling(Math.Abs((dtEnd - dtStart).Days)/(double) 10); //int timeout = monitoringFactory.MonitoringAnalyseDict.Count*20*daynumbers; //if (timeout > 20000) timeout = 20000; //Thread.Sleep(timeout); return(monitoringFactory); }
public Task RunServerBuild(BackgroundWorker worker) { var parents = MonitoringAnalyseDict.Keys.ToList(); try { //Запрос формирования данных ARM_Service_.Monit_GetArchive(_waiterId, parents, _selectedСhannels , DtStart, DtEnd, _maxValue, _selectedEvents, IsConcentratorsEnabled, _filterFlag); //Ждем формирования первых пакетов Thread.Sleep(1000); } catch (Exception ex) { Manager.UI.ShowMessage(ex.Message); return(null); } //if (_showTotalStatistic != null) //{ // _showTotalStatistic(request.StatisticInformation); //} _isRequestCompleted = false; //double packetSize = request.ProgressPercent; //if (request.Result != null && request.Result.Count > 0) //{ // _stackForBuildResult.PushRange(request.Result.ToArray()); // _progressBar.IncValue(packetSize); //} //Отмена выполнения if (worker.CancellationPending || _cancellationToken.IsCancellationRequested) { return(null); } //Запускаем построитель результатов var builderTask = Task.Factory.StartNew(BuildPacketResult, _cancellationToken); //Получение следующих пакетов bool isLastPacket = false; int voidCounter = 0; int errCounter = 0; bool isFirst = true; TStatisticInformation statisticInformation = null; int requestNumber = 0; do { try { if (_cancellationToken.IsCancellationRequested) { break; } var packet = ServiceFactory.ArmServiceInvokeSync <Tuple <bool, MemoryStream, string, TStatisticInformation, TMonitoringAnalyseResult> >("Monit_WaitArchives", requestNumber, _waiterId); if (packet != null) { if (!string.IsNullOrEmpty(packet.Item3)) { Manager.UI.ShowMessage(packet.Item3); } isLastPacket = packet.Item1; if (isLastPacket) { statisticInformation = packet.Item4; break; } if (packet.Item2 != null) { requestNumber++; //var nextPart = packet.Item2.DecompressAndDeserialize<List<TMonitoringAnalyseResult>>(); var decomoressed = CompressUtility.DecompressGZip(packet.Item2); decomoressed.Position = 0; var nextPart = Serializer.Deserialize <List <TMonitoringAnalyseResult> >(decomoressed); if (nextPart != null && nextPart.Count > 0) { _stackForBuildResult.PushRange(nextPart.ToArray()); voidCounter = 0; _mres.Set(); if (isFirst) { _progressBar.SetIndeterminat(false); isFirst = false; } } else { Thread.Sleep(2000); } } else { if (++voidCounter > 501) { isLastPacket = true; Manager.UI.ShowMessage("MonitoringClientFactory: Превышен лимит ожидания пакетов"); } else { Thread.Sleep(5000); } } } else { throw new Exception(); } errCounter = 0; } catch (Exception ex) { if (++errCounter > 6) { isLastPacket = true; Manager.UI.ShowMessage("MonitoringClientFactory: Превышен лимит пустых пакетов"); _progressBar.SetIndeterminat(false); } else { Manager.UI.ShowMessage(ex.Message); Thread.Sleep(1000); } } Thread.Sleep(200); } while (!isLastPacket); if (statisticInformation != null && _showTotalStatistic != null) { _showTotalStatistic(statisticInformation); } _isRequestCompleted = true; _mres.Set(); return(builderTask); }