我有一个生产者/消费者流程.消费对象具有ID属性(类型为整数),我想一次只消耗一个具有相同ID的对象.我怎么能这样做?
也许我可以做这样的事情,但我不喜欢它(创造了太多的对象,而每天只有一两个具有相同ID的消息可以被消耗而且锁(_lockers)有点耗费时间:
private readonly Dictionary<int,object> _lockers = new Dictionary<int,object>();
private object GetLocker(int id)
{
lock(_lockers)
{
if(!_lockers.ContainsKey(id))
_lockers.Add(id,new object());
return _lockers[id];
}
}
private void Consume(T notif)
{
lock(GetLocker(notif.ID))
{
...
}
}
enter code here
Run Code Online (Sandbox Code Playgroud)
注意:同样的问题,ID属性是string类型(在那个cas中我可以锁定string.Internal(currentObject.ID)
Dam*_*ver 12
如注释中所示,一种方法是使用固定的锁池(比如32),并采用ID模32来确定要采用的锁.这会导致一些错误的锁共享.32是从空中挑选的数字 - 这将取决于您的ID值分布,消费者数量等.