C# 如何锁定字典?
我在多线程应用程序中有一个静态字典。 A类阅读字典,B类从字典中删除。 我想在从字典中删除或读取字典时锁定它,以防止在并发情况下访问字典时出现问题。 我怎样才能把字典锁上C# 如何锁定字典?,c#,C#,我在多线程应用程序中有一个静态字典。 A类阅读字典,B类从字典中删除。 我想在从字典中删除或读取字典时锁定它,以防止在并发情况下访问字典时出现问题。 我怎样才能把字典锁上 public static Dictionary<string, Thread> DicThreads = new Dictionary<string, Thread>(); Class A() { private void MethodA() { if (Di
public static Dictionary<string, Thread> DicThreads = new Dictionary<string, Thread>();
Class A()
{
private void MethodA()
{
if (DicThreads.ContainsKey(key))
if (DicThreads[key] == null || DicThreads[key].ThreadState == ThreadState.Stopped)
{
//--- Do something
}
}
class B
{
private void MethodB()
{
DicThreads.Remove(key)
}
}
publicstaticdictionary DicThreads=newdictionary();
A类()
{
私有无效方法a()
{
if(DicThreads.ContainsKey(键))
if(DicThreads[key]==null | | DicThreads[key].ThreadState==ThreadState.Stopped)
{
//---做点什么
}
}
B类
{
私有无效方法b()
{
DicThreads.Remove(键)
}
}
您可以使用
但是,如果您的应用程序中有一个线程字典,那么您可能是做错了 。在NuGet上的Nito.AsyncEx包中提供 如果您需要一个异步集合,它是一个很好的候选者,它实际上需要一个ConcurrentBag/Stack/Queue或其他一些
IProducerConsumerCollection
来提供支持状态
请记住,如上所述,您不应该像问题中所示自己管理线程。您可以按照pwas的建议使用
ConcurrentDictionary
。如果您想同步现有的字典,请使用lock
关键字
通常,您应该使用一个单独的对象进行同步,并且不要将该对象暴露在您的范围之外。这样可以确保块外的代码不会使用同一个对象进行锁定并导致冲突
public static Dictionary<string, Thread> DicThreads = new Dictionary<string, Thread>();
private static object sync = new Object();
Class A() {
private void MethodA() {
lock (sync) {
if (DicThreads.ContainsKey(key)) {
if (DicThreads[key] == null || DicThreads[key].ThreadState == ThreadState.Stopped) {
//--- Do something
}
}
}
}
}
class B {
private void MethodB() {
lock (sync) {
DicThreads.Remove(key)
}
}
}
publicstaticdictionary DicThreads=newdictionary();
私有静态对象同步=新对象();
A类(){
私有无效方法a(){
锁定(同步){
if(DicThreads.ContainsKey(键)){
if(DicThreads[key]==null | | DicThreads[key].ThreadState==ThreadState.Stopped){
//---做点什么
}
}
}
}
}
B类{
私有无效方法b(){
锁定(同步){
DicThreads.Remove(键)
}
}
}
使用ConcurrentDictionary
为什么不使用ConcurrentDictionary
?:如果您使用的是.NET 4或更高版本,请选择COncurrentDictionary@pwas你们应该把它作为一个答案来发布。@sharpcloud的问题是关于锁定休闲字典的——我已经发布了一个带有单链接的替代方案,所以我认为它不是一个好的answ呃:)@pwas当然可以,但这是锁定完整字典的一个非常好的替代方法。使用最好的工具来完成这项工作,例如:)对于开发人员来说,盲目地盯着他们当前的解决方案是很常见的,而另一种更好的方法尽管不同。
public static Dictionary<string, Thread> DicThreads = new Dictionary<string, Thread>();
private static object sync = new Object();
Class A() {
private void MethodA() {
lock (sync) {
if (DicThreads.ContainsKey(key)) {
if (DicThreads[key] == null || DicThreads[key].ThreadState == ThreadState.Stopped) {
//--- Do something
}
}
}
}
}
class B {
private void MethodB() {
lock (sync) {
DicThreads.Remove(key)
}
}
}