1.ConcurrentBag
ConcurrentBag<T>
对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全!
- 该集合是一个支持重复元素的无序集合,专门针对下面多个线程工作时,集合进行了优化。每个线程产生和消费自己的任务,极少与其他线程的任何交互(若需要使用交互,则必须使用锁操作)。
1.1.TryTake(out str) 不能删除指定项
var device = GloalConfigs.FinalDeviceList.FirstOrDefault(s => s.GatwayCode == gatCode && s.DeviceId == deviceId);
if (device != null)
{
#region 修改
GloalConfigs.FinalDeviceList.TryTake(out device);
#endregion
}
1.2.删除指定项
public static ConcurrentBag<String> RemoveItemFromConcurrentBag(ConcurrentBag<String> Array, String Item)
{
var Temp=new ConcurrentBag<String>();
Parallel.ForEach(Array, Line =>
{
if (Line != Item) Temp.Add(Line);
});
return Temp;
}
1.2.删除所有
Clear();
1.3.ToList,仅仅用来做查询,不可用来移除用
var list = concurrentBag.ToList();
#错误用法
Panda.Common.Gatway.GloalConfigs.CurrentZoneStatusList.ToList().RemoveAll(s => s.ZoneId == zoneId);
#正确做法
Panda.Common.Gatway.GloalConfigs.CurrentZoneStatusList.TryTake(out currentZoneStatusInfo);
1.4.FirstOrDefault
查询出来的值,可以用作 update
if (Panda.Common.Gatway.GloalConfigs.CurrentDeviceStatusList != null)
{
currentStatusInfo1 = Panda.Common.Gatway.GloalConfigs.CurrentDeviceStatusList.FirstOrDefault(s => s.DeviceId == device.DeviceId);
}
if (currentStatusInfo1 == null)
{
currentStatusInfo1 = new Panda.Model.DTO.Modbus.DeviceCurrentStatusInfo();
currentStatusInfo1.DeviceId = device.DeviceId;
}
currentStatusInfo1.IsOpen = true;
currentStatusInfo1.OperaterOpenTime = DateTime.Now;
currentStatusInfo1.FlowDeviceId = device.DeviceFlowId;
currentStatusInfo1.IsValveType = true;