好吧,这是我的属性(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 之一
关于具有锁定属性的 c# foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8774314/