我在 C# 中使用了 lock 语句来专门执行一段代码。有没有办法基于密钥做同样的事情。
例如:
lock(object, key)
{
//code-here
}
我有一个方法,它有一些代码不是线程安全的,但前提是键(字符串)在两个并行执行中恰好相同。 有没有办法以某种方式在.NET中完成此操作?
如果有一种方法,那么如果并行执行中使用的密钥不同并且可以提高性能,我们可以进行并行执行。
将锁定对象放入由键索引的字典中 - Dictionary<string, object>
并按键抓取对象以锁定。
如果需要动态添加新的键/锁对象对,请确保锁定字典访问,否则如果在构造后仅从字典中读取值,则不需要额外的锁定。
我创建了一个名为AsyncKeyedLock的库来解决这个问题。在内部,它使用ConcurrentDictionary
和SemaphoreSlim
对象。
如果您使用的是异步代码,则可以使用:
using (await _locker.LockAsync(myObject.Id))
{
...
}
或者,如果您使用的是同步代码:
using (_locker.Lock(myObject.Id))
{
...
}