gpt4 book ai didi

c# - 在没有异常处理的方法中使用 SemaphoreSlim

转载 作者:行者123 更新时间:2023-11-30 20:37:45 29 4
gpt4 key购买 nike

目前,我正在努力实现 SemaphoreSlim 以“锁定”必须是线程安全的方法的“部分”。我的问题是,在没有异常处理过载的情况下实现它是非常困难的。因为在释放“锁”之前抛出异常时,它将永远留在那里。

这是一个例子:

private SemaphoreSlim _syncLock = new SemaphoreSlim(1);
private IDictionary<string, string> dict = new Dictionary<string, string>();

public async Task ProcessSomeThing(string input)
{
string someValue = await GetSomeValueFromAsyncMethod(input);
await _syncLock.WaitAsync();
dict.Add(input, someValue);
_syncLock.Release();
}

如果输入多次具有相同的值,此方法将抛出异常,因为具有相同键的项将被添加到字典中两次,并且“锁”不会被释放。

假设我有很多 _syncLock.Release();_syncLock.Release();,很难编写 try- catch.ContainsKey 或其他东西。这会完全破坏代码...是否可以在抛出 Exception 或某个术语时始终释放锁?

希望清楚我要问/寻找什么。

谢谢大家!

最佳答案

我建议不要使用lockSemaphoreSlim .相反,使用正确的工具来完成工作——在这种情况下,使用 ConcurrentDictionary<TKey, Lazy<TValue>> 似乎是合适的。在使用 IDictionary<string, string>和锁定和信号量的。一年前有几篇关于此模式的文章,here's one of the them .所以按照这个建议的模式看起来像这样:

private ConcurrentDictionary<string, Lazy<Task<string>>> dict = 
new ConcurrentDictionary<string, Lazy<Task<string>>>();

public Task ProcessSomeThing(string input)
{
return dict.AddOrUpdate(
input,
key => new Lazy<Task<string>>(() =>
GetSomeValueFromAsyncMethod(key),
LazyThreadSafetyMode.ExecutionAndPublication),
(key, existingValue) => new Lazy<Task<string>>(() =>
GetSomeValueFromAsyncMethod(key), // unless you want the old value
LazyThreadSafetyMode.ExecutionAndPublication)).Value;
}

最终,这实现了 asynchronously线程安全 目标。添加到您的 dictionary .假设有一个 try / catch,错误处理如您所料发生。在你的GetSomeValueFromAsyncMethod功能。更多资源:

最后,我创建了 an example .NET fiddle to help demonstrate the idea .

关于c# - 在没有异常处理的方法中使用 SemaphoreSlim,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35752306/

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