Skip to main content
 首页 » 编程设计

具有锁定属性的 c# foreach

2024年01月13日32dflying

好吧,这是我的属性(property)

public List<String> names{ 
    get{ 
        lock(_names) 
            return _names; 
       } 
   set{ 
       lock(_names) 
           _names = value 
      } 
} 
private List<String> _names; 

现在假设我对这样的名称执行 foreach

foreach(String s in names) 
{ 
    Console.WriteLine(s); 
} 

我的问题是,names 是通过整个 foreach 锁定的,还是每次 s 都只lock > 已设置,然后在 foreach 中解锁。

如果这令人困惑,就说我尝试这样做

foreach(String s in names) 
{ 
    lock(names) 
        Console.WriteLine(s); 
} 

我会陷入僵局吗?

请您参考如下方法:

lock(_names) return _names; 

是以下的缩写:

try 
{ 
  Monitor.Enter(_names); 
  return _names; 
} 
finally 
{ 
  Monitor.Exit(_names); 
} 

相当于:

Monitor.Enter(_names); 
Monitor.Exit(_names); 
return _names; 

这样看应该更清楚锁是不必要的。 您可能有兴趣使用 thread-safe collections 之一