问题:
你需要创建一个从多个线程中并发读写的键值对的集合,并且不需要手动使用同步原语来保护它。
解决方案:
使用ConcurrentDictionary<Tkey,TValue>容纳数据项并线程安全的方式来访问它们。举例来说,考虑一个模拟情形,球迷到一个体育馆去观看他们喜爱的体育赛事,并且场馆仅有若干个入口。
首先,我们需要一些球迷并且记录他们的名称、何时入场以及通过哪个入口入场。
public class Fan
{
public string Name { get; set; }
public DateTime Admitted { get; set; }
public int AdmittanceGateNumber { get; set; }
}
// 设置一个参加活动的球迷名单
List<Fan> fansAttending = new List<Fan>();
for (int i = 0; i < 100; i++)
fansAttending.Add(new Fan() { Name = "Fan" + i });
Fan[] fans = fansAttending.ToArray();
每个入口每次只能有一个人入场,并且在如此拥挤的活动中,入口通常都有摄像头监控。我们将用一个静态的ConcurrentDictionary<int,Fan>来表示体育馆的入口以及当前在入口的Fan,并用一个静态布尔变量(monitorGates)来表明何时入口不需要监控(也就是所有球迷都已入场的时候)。
private static ConcurrentDictionary<int, Fan> stadiumGates = new ConcurrentDictionary<int, Fan>();
private static bool monitorGates = true;
假设活动现场口有10个入口(gateCount),为每个入口使用AdmitFans方法启动一个Task,让每个入口能够进入若干球迷。还要为每个入口使用MonitorGate方法启动一个对应的Task,将安全监控打开。当所有球迷都入场后,停止监控入口。
int gateCount = 10;
Task[] entryGates = new Task[gateCount];
Task[] securityMonitors = new Task[gateCount];
for (int gate