如何通过方法参数锁定?

dot*_*ter 11 c# multithreading locking

string Get(string key){
   lock(_sync){
    //   DoSomething
   }
}
Run Code Online (Sandbox Code Playgroud)

如果DoSomething仅依赖于密钥,我想要密钥依赖锁.我认为它可能是带有同步对象的字典.有没有完整的解决方案?

像真实例子一样 在asp.net中锁定缓存的最佳方法是什么?

Jon*_*eet 22

好吧,你可以创建一个Dictionary<string, object>并且懒洋洋地填充对象来锁定它.例如:

readonly Dictionary<string, object> dictionary = new Dictionary<string, object>();
readonly object dictionaryLock = new object();

string Get(string key) {
    object bodyLock;
    lock (dictionaryLock) {
        if (!dictionary.TryGetValue(key, out bodyLock)) {
            bodyLock = new object();
            dictionary[key] = bodyLock;
        }
    }
    lock (bodyLock) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你需要在其他地方以相同的方式锁定,我会将"锁定查找"部分移动到辅助方法.请注意,如果您使用的是.NET 4,则ConcurrentDictionary可以使这更容易,而无需使用额外的锁定.

请注意,在这个设计中没有任何东西可以清除字典...你有一套固定的密钥(在这种情况下没关系)还是可以永远增长?

你似乎已经意识到的一件事:锁定钥匙本身将是一个非常糟糕的主意.等密钥可以是不同的对象,如果还有其他任何代码锁定字符串,它可能会干扰此代码.锁定字符串几乎总是错误的:)