Esempio n. 1
0
        protected override void ResetCore(List <FlowDevice> devices)
        {
            foreach (FlowDevice newDevice in devices)
            {
                foreach (var relation in newDevice.FlowDevice_FlowChannels)
                {
                    foreach (Lane lane in relation.Channel.Lanes)
                    {
                        if (!_laneBlocks.ContainsKey(lane.DataId))
                        {
                            LaneFlowStatisticsBlock laneBlock = new LaneFlowStatisticsBlock(_serviceProvider);
                            laneBlock.LinkTo(_oneBatchBlock, _fiveBatchBlock, _fifteenBatchBlock, _sixtyBatchBlock);
                            LaneItem laneItem = new LaneItem
                            {
                                LaneBlock   = laneBlock,
                                Length      = lane.Length,
                                RoadSection = relation.Channel.SectionId.HasValue
                                    ? relation.Channel.RoadSection
                                    : null
                            };
                            _laneBlocks.TryAdd(lane.DataId, laneItem);
                            _logger.LogInformation((int)LogEvent.流量数据块, $"添加车道 {lane.DataId}");
                        }
                    }
                }
            }

            foreach (FlowDevice oldDevice in _devices)
            {
                foreach (var relation in oldDevice.FlowDevice_FlowChannels)
                {
                    foreach (Lane lane in relation.Channel.Lanes)
                    {
                        if (devices.SelectMany(d => d.FlowDevice_FlowChannels)
                            .Select(r => r.Channel)
                            .SelectMany(c => c.Lanes)
                            .All(l => l.DataId != lane.DataId))
                        {
                            if (_laneBlocks.TryRemove(lane.DataId, out LaneItem item))
                            {
                                item.LaneBlock.InputBlock.Complete();
                                item.LaneBlock.WaitCompletion();
                            }
                            _logger.LogInformation((int)LogEvent.流量数据块, $"删除车道 {lane.DataId}");
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        protected override void OpenCore()
        {
            //重置计数
            _ok      = 0;
            _unknown = 0;

            //车道
            _laneFlowCacheBlock = new LaneFlowCacheBlock(_serviceProvider);
            _oneBatchBlock      = new BatchBlock <LaneFlow>(BatchSize);
            _fiveBatchBlock     = new BatchBlock <LaneFlow>(BatchSize);
            _fifteenBatchBlock  = new BatchBlock <LaneFlow>(BatchSize);
            _sixtyBatchBlock    = new BatchBlock <LaneFlow>(BatchSize);
            _laneFlowDbBlock    = new LaneFlowDbBlock(ThreadCount, _serviceProvider);

            _oneBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions {
                PropagateCompletion = false
            });
            _fiveBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions {
                PropagateCompletion = false
            });
            _fifteenBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions {
                PropagateCompletion = false
            });
            _sixtyBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions {
                PropagateCompletion = false
            });

            _laneBlocks.Clear();
            foreach (FlowDevice device in _devices)
            {
                foreach (var relation in device.FlowDevice_FlowChannels)
                {
                    foreach (Lane lane in relation.Channel.Lanes)
                    {
                        LaneFlowStatisticsBlock laneBlock = new LaneFlowStatisticsBlock(_serviceProvider);
                        laneBlock.LinkTo(_oneBatchBlock, _fiveBatchBlock, _fifteenBatchBlock, _sixtyBatchBlock);
                        LaneItem laneItem = new LaneItem
                        {
                            LaneBlock   = laneBlock,
                            Length      = lane.Length,
                            RoadSection = relation.Channel.SectionId.HasValue
                                ? relation.Channel.RoadSection
                                : null
                        };
                        _laneBlocks.TryAdd(lane.DataId, laneItem);
                    }
                }
            }
        }