gpt4 book ai didi

c# - 有条件地锁定资源

转载 作者:行者123 更新时间:2023-11-30 16:03:39 25 4
gpt4 key购买 nike

我有一个 consumer 类,它是一个Singleton。是否有可能以任何方式有条件地锁定资源。当前,外部资源被 AsyncEx ( https://github.com/StephenCleary/AsyncEx) 框架“全局”锁定。但我更愿意根据输入消息中的 Key 锁定它,因此具有不同 Keys 的消息不应锁定资源。

public class Consumer
{
private readonly AsyncLock _mutex = new AsyncLock();

protected async Task Process(Message msg)
{
**UNBLOCKED CODE**

using (await _mutex.LockAsync())
{
await GetData(msg.Key);
}

**UNBLOCKED CODE**
}
}

有什么建议吗?

最佳答案

不是只有一个 AsyncLock,而是创建一个包含它们的字典。 message key是字典中AsyncLock的key。只要一次只处理一条具有给定 key 的消息,就不会发生任何阻塞。我进一步假设您的消息 key 是一个字符串。

private readonly Dictionary<string, AsyncLock> _mutexes = new Dictionary<string, AsyncLock>();

private AsyncLock GetMutex(string key)
{
lock (_mutexes)
{
AsyncLock mutex;
if (!_mutexes.TryGetValue(key, out mutex))
{
// no mutex yet, create a new one
mutex = new AsyncLock();
_mutexes.Add(key, mutex);
}
return mutex;
}
}

....
protected async Task Process(Message msg)
{
using (await GetMutex(msg.Key).LockAsync())
{
...
}
}

请注意,如果某个键的互斥量已经存在,则很可能可以进一步优化 GetMutex 方法以避免锁定操作,例如首先检查 ContainsKey,如果没有则锁定并添加。但我不确定该优化是否是 100% 线程安全的,所以我没有在此处包含它。

受到 Jason 的 ConcurrentDictionary 评论的启发,我决定提供 GetMutex 的 ConcurrentDictionary 版本的代码。我不建议尝试我在上面划掉的关于优化对非线程安全字典的访问。

ConcurrentDictionary<string, AsyncLock> _mutexes = new ConcurrentDictionary<string, AsyncLock>();

private AsyncLock GetMutexes(string key)
{
return _mutexes.GetOrAdd(key, s => { return new AsyncLock(); });
}

关于c# - 有条件地锁定资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com