具有锁定属性的 c# foreach

标签 c# foreach locking

好吧,这是我的属性(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/

相关文章:

c# - 列出 Windows Azure Blob 存储容器中的 EMPTY 目录

javascript - 如何设置 foreach jQuery JSON CSV

c++ - MFC/CCriticalSection : Simple lock situation hangs

java - 锁在 API 中等待,以防暴露

c# - C#条件OrderBy

c# - SqlConnection 构造函数中无法识别的转义序列

c# - 在 ASP.NET Core 下拉列表中显示部分枚举列表

PowerShell - 增加左手变量

vb.net - 对于 ListBox1 中的每个项目做一些事情然后将项目添加到 listbox2 vb

ios - isRegisteredForRemoteNotifications 使用 semaphore_wait_trap 锁定 UI