示例#1
0
        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);
        }