C# 4.0 锁()无效

C# 4.0 锁()无效,c#-4.0,C# 4.0,我试图在对象通过其元素时锁定它。我的arraylist allThreads实际上没有被锁定,因为在执行“foreach”的过程中,我得到一个异常,说“集合被修改;枚举操作可能无法执行”。我想这就是lock的全部内容 lock (mApp.allThreads) { foreach (Thread t in mApp.allThreads) if (t.Name == "OpcDAWriter" && t != Thread.CurrentThread)

我试图在对象通过其元素时锁定它。我的arraylist allThreads实际上没有被锁定,因为在执行“foreach”的过程中,我得到一个异常,说“集合被修改;枚举操作可能无法执行”。我想这就是lock的全部内容

lock (mApp.allThreads)
{
    foreach (Thread t in mApp.allThreads)
        if (t.Name == "OpcDAWriter" && t != Thread.CurrentThread)
            t.Join(); 
}

您正在加入
t
线程,因此它可能会从
mApp中删除。所有线程
或由于加入而发生的其他事情,从而修改集合

而且,仅仅因为您正在查看对象,并不是所有其他方法都可以锁定它,只有当所有访问该对象的方法都锁定它时,锁定才会起作用。您可以尝试使用外部对象作为锁定参数,即:

private readonly _lock = new object();

[...]
lock(_lock)
{
  foreach....
}

但我怀疑这会改变什么。

我想你可能误解了锁对你的作用。它不会阻止其他代码操作已锁定的对象。它所做的是防止一个线程在另一个线程持有锁时,在一个对象上获取long

如果要防止一个线程在另一个线程对集合进行迭代时操纵该集合,则需要将迭代代码和操纵代码放在
lock
块中,锁定在同一对象上

简单示例:

class LockDemo
{
    private IList<string> _items;
    private object _lock = new object();
    public LockDemo()
    {
        _items = new List<string>(new[] { "one", "two", "three" });
    }

    public void RemoveItem(string item)
    {
        lock (_lock)
        {
            _items.Remove(item);
        }
    }

    public void DoSomethingThatIteratesOverTheList()
    {
        lock (_lock)
        {
            foreach (var item in _items)
            {
                // do something with item
            }
        }
    }
}
类锁演示
{
私人IList_项目;
私有对象_lock=新对象();
公开密码
{
_项目=新列表(新[]{“一”、“二”、“三”});
}
public void removietem(字符串项)
{
锁
{
_项目。移除(项目);
}
}
public void dosomethingthaitesortexthelist()
{
锁
{
foreach(var项目在_项目中)
{
//对这个项目做些什么
}
}
}
}

请注意,对列表的所有访问(本例中的构造函数除外)都包装在
lock
块中,这些块都锁定在同一对象上。还请注意,此对象不是列表本身,而是仅用于锁定目的的对象。这表明,
lock
不会锁定对象本身,但提供了一种机制来控制不同线程可以或不可以并行执行代码的哪些部分。

修改所有线程的代码在哪里?它也会锁定收藏吗?啊,现在我明白了锁定的行为。(我的锁定对象的两个用户中只有一个使用了锁定)。很好的解释,谢谢你们!