使用 .NET 中的密钥的独占锁

本文关键字:密钥 使用 NET | 更新日期: 2023-09-27 17:56:44

我在 C# 中使用了 lock 语句来专门执行一段代码。有没有办法基于密钥做同样的事情。

例如:

lock(object, key)
{
//code-here
}

我有一个方法,它有一些代码不是线程安全的,但前提是键(字符串)在两个并行执行中恰好相同。 有没有办法以某种方式在.NET中完成此操作?

如果有一种方法,那么如果并行执行中使用的密钥不同并且可以提高性能,我们可以进行并行执行。

使用 .NET 中的密钥的独占锁

将锁定对象放入由键索引的字典中 - Dictionary<string, object>并按键抓取对象以锁定。

如果需要动态添加新的键/锁对象对,请确保锁定字典访问,否则如果在构造后仅从字典中读取值,则不需要额外的锁定。

我创建了一个名为AsyncKeyedLock的库来解决这个问题。在内部,它使用ConcurrentDictionarySemaphoreSlim对象。

如果您使用的是异步代码,则可以使用:

using (await _locker.LockAsync(myObject.Id))
{
   ...
}

或者,如果您使用的是同步代码:

using (_locker.Lock(myObject.Id))
{
   ...
}