如何通过方法参数锁定?

string Get(string key){ lock(_sync){ // DoSomething } } 

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

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

好吧,你可以创建一个Dictionary并懒惰地用对象来填充它来锁定。 例如:

 readonly Dictionary dictionary = new Dictionary(); 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) { ... } } 

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

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

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