我有一个方法需要专门运行一段代码,但我只想在确实需要时添加此限制。根据 Id 值(Int32),我将加载/修改不同的对象,因此锁定所有线程的访问没有意义。这是这样做的第一次尝试 -
private static readonly ConcurrentDictionary<int, Object> LockObjects = new ConcurrentDictionary<int, Object>();
void Method(int Id)
{
lock(LockObjects.GetOrAdd(Id,new Object())
{
//Do the long running task here - db fetches, changes etc
Object Ref;
LockObjects.TryRemove(Id,out Ref);
}
}
我怀疑这是否有效 - TryRemove 可能会失败(这将导致 ConcurrentDictionary 不断变大)。
一个更明显的错误是 TryRemove 成功删除了该对象,但如果有其他线程(对于相同的 Id)正在该对象上等待(锁定),然后具有相同 Id 的新线程进入并添加新的对象并开始处理,因为没有其他人在等待它刚刚添加的对象。
我应该使用 TPL 或某种 ConcurrentQueue 来对我的任务进行排队吗?最简单的解决方案是什么?
我使用类似的方法来锁定相关项目的资源,而不是一揽子资源锁定......它工作得很好。
你已经快到了,但你真的不需要从字典中删除该对象;只需让具有该 id 的下一个对象获得该对象的锁定即可。
您的应用程序中唯一 ID 的数量肯定有限制吗?那个限制是多少?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)