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}"); } } } } }
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); } } } }