C# 如何锁定字典?

C# 如何锁定字典?,c#,C#,我在多线程应用程序中有一个静态字典。 A类阅读字典,B类从字典中删除。 我想在从字典中删除或读取字典时锁定它,以防止在并发情况下访问字典时出现问题。 我怎样才能把字典锁上 public static Dictionary<string, Thread> DicThreads = new Dictionary<string, Thread>(); Class A() { private void MethodA() { if (Di

我在多线程应用程序中有一个静态字典。 A类阅读字典,B类从字典中删除。 我想在从字典中删除或读取字典时锁定它,以防止在并发情况下访问字典时出现问题。 我怎样才能把字典锁上

    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)
    }
 }

}