1.ConcurrentBag

ConcurrentBag<T>对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全!

  • 该集合是一个支持重复元素的无序集合,专门针对下面多个线程工作时,集合进行了优化。每个线程产生和消费自己的任务,极少与其他线程的任何交互(若需要使用交互,则必须使用锁操作)。

1.1.TryTake(out str) 不能删除指定项

  1. var device = GloalConfigs.FinalDeviceList.FirstOrDefault(s => s.GatwayCode == gatCode && s.DeviceId == deviceId);
  2. if (device != null)
  3. {
  4. #region 修改
  5. GloalConfigs.FinalDeviceList.TryTake(out device);
  6. #endregion
  7. }

1.2.删除指定项

  1. public static ConcurrentBag<String> RemoveItemFromConcurrentBag(ConcurrentBag<String> Array, String Item)
  2. {
  3. var Temp=new ConcurrentBag<String>();
  4. Parallel.ForEach(Array, Line =>
  5. {
  6. if (Line != Item) Temp.Add(Line);
  7. });
  8. return Temp;
  9. }

1.2.删除所有

  1. Clear();

1.3.ToList,仅仅用来做查询,不可用来移除用

  1. var list = concurrentBag.ToList();
  2. #错误用法
  3. Panda.Common.Gatway.GloalConfigs.CurrentZoneStatusList.ToList().RemoveAll(s => s.ZoneId == zoneId);
  4. #正确做法
  5. Panda.Common.Gatway.GloalConfigs.CurrentZoneStatusList.TryTake(out currentZoneStatusInfo);

1.4.FirstOrDefault

查询出来的值,可以用作 update

  1. if (Panda.Common.Gatway.GloalConfigs.CurrentDeviceStatusList != null)
  2. {
  3. currentStatusInfo1 = Panda.Common.Gatway.GloalConfigs.CurrentDeviceStatusList.FirstOrDefault(s => s.DeviceId == device.DeviceId);
  4. }
  5. if (currentStatusInfo1 == null)
  6. {
  7. currentStatusInfo1 = new Panda.Model.DTO.Modbus.DeviceCurrentStatusInfo();
  8. currentStatusInfo1.DeviceId = device.DeviceId;
  9. }
  10. currentStatusInfo1.IsOpen = true;
  11. currentStatusInfo1.OperaterOpenTime = DateTime.Now;
  12. currentStatusInfo1.FlowDeviceId = device.DeviceFlowId;
  13. currentStatusInfo1.IsValveType = true;

Add(): 添加元素

TryPeek(): 检查元素

TryTake():获取元素

参考资料