【发布时间】:2016-06-15 14:32:48
【问题描述】:
目前我正在努力实现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 或离开某个术语时始终释放锁?
希望很清楚我在要求/寻找什么。
谢谢大家!
【问题讨论】:
标签: c# multithreading locking async-await semaphore