gpt4 book ai didi

c# - 当我在 c# 中使用 Lock 为什么我得到 : "Collection was modified; enumeration operation may not execute."

转载 作者:太空狗 更新时间:2023-10-29 23:24:33 27 4
gpt4 key购买 nike

我修改了枚举集合,但是,我在它周围加了锁...它不明白为什么我得到“集合已修改;枚举操作可能无法执行。”我不想用以下方法解决它:“foreach(IObserver obs in _observers.ToList())”

代码是观察者模式:

class Program
{
static void Main(string[] args)
{
Subject sub = new Subject();
Obs1 obs1 = new Obs1(sub);
Obs2 obs2 = new Obs2(sub);

sub.Nodefiy();
sub.Nodefiy();
sub.Nodefiy();
sub.Nodefiy();
sub.Nodefiy();
sub.Nodefiy();

Console.ReadKey();
}
}

public interface IObserver
{
void Update(int data);
}

public interface ISubscrib
{
void Reg(IObserver obs);
void UnReg(IObserver obs);
void Nodefiy();
}

public class Subject : ISubscrib
{
private static Object _lock;
private List<IObserver> _observers;
private int data = 0;

public Subject()
{
_lock = new Object();
_observers = new List<IObserver>();
}

public void Reg(IObserver obs)
{
lock (_lock)
{
_observers.Add(obs);
}
}

public void UnReg(IObserver obs)
{
lock (_lock)
{
int ind = _observers.IndexOf(obs);
if (ind >= 0)
{
_observers.RemoveAt(ind);
}
}
}

public void Nodefiy()
{
data = data + 1;
lock (_lock)
{
int sentData = data;
//foreach (IObserver obs in _observers.ToList<IObserver>())
foreach (IObserver obs in _observers)
{
obs.Update(sentData);
}
}
}
}

public class Obs1 : IObserver
{
private ISubscrib _subj;
public Obs1(ISubscrib subj)
{
_subj = subj;
_subj.Reg(this);
}

public void Update(int data)
{
Console.WriteLine("Obs1: {0}", data);
}
}

public class Obs2 : IObserver
{
private ISubscrib _subj;

public Obs2(ISubscrib subj)
{
_subj = subj;
_subj.Reg(this);
}

public void Update(int data)
{
Console.WriteLine("Obs2: {0}", data);
if (data > 3)
{
_subj.UnReg(this);
}
}
}

谁能帮帮我?谢谢...

最佳答案

当您的 Obj2 在此 foreach 循环内调用更新时,它会返回到您的 Subject 对象并在同一线程中修改此 _observers 集合。这就是锁不起作用的原因。这不是同步问题。您的问题发生在同一个线程中。

我不确定您要在此代码中做什么,所以我无法提供进一步的帮助。

关于c# - 当我在 c# 中使用 Lock 为什么我得到 : "Collection was modified; enumeration operation may not execute.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13892646/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com