相关疑难解决方法(0)

收集被修改; 枚举操作可能无法执行

我无法理解这个错误的底部,因为当附加调试器时,它似乎不会发生.下面是代码.

这是Windows服务中的WCF服务器.每当存在数据事件时,服务就会调用NotifySubscribers方法(以随机间隔,但不常见 - 每天约800次).

当Windows窗体客户端订阅时,订户ID将添加到订阅者字典中,当客户端取消订阅时,将从字典中删除它.客户端取消订阅时(或之后)发生错误.看来,下次调用NotifySubscribers()方法时,foreach()循环失败并显示主题行中的错误.该方法将错误写入应用程序日志,如下面的代码所示.当附加调试器并且客户端取消订阅时,代码执行正常.

你看到这段代码有问题吗?我是否需要使字典线程安全?

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class SubscriptionServer : ISubscriptionServer
{
    private static IDictionary<Guid, Subscriber> subscribers;

    public SubscriptionServer()
    {            
        subscribers = new Dictionary<Guid, Subscriber>();
    }

    public void NotifySubscribers(DataRecord sr)
    {
        foreach(Subscriber s in subscribers.Values)
        {
            try
            {
                s.Callback.SignalData(sr);
            }
            catch (Exception e)
            {
                DCS.WriteToApplicationLog(e.Message, 
                  System.Diagnostics.EventLogEntryType.Error);

                UnsubscribeEvent(s.ClientId);
            }
        }
    }


    public Guid SubscribeEvent(string clientDescription)
    {
        Subscriber subscriber = new Subscriber();
        subscriber.Callback = OperationContext.Current.
                GetCallbackChannel<IDCSCallback>();

        subscribers.Add(subscriber.ClientId, subscriber);

        return subscriber.ClientId;
    }


    public void UnsubscribeEvent(Guid clientId)
    {
        try
        {
            subscribers.Remove(clientId);
        }
        catch(Exception …
Run Code Online (Sandbox Code Playgroud)

c# concurrency wcf dictionary thread-safety

861
推荐指数
10
解决办法
57万
查看次数

C# - 集合被修改;枚举操作可能不会执行

在我编写的冗长代码中有一个按钮单击事件。我有一个对象列表。每次单击按钮时,都应修改列表(例如,应删除某些项目),然后使用 foreach 循环进行迭代。

List<Person> lp=new List<Person>();
lp.RemoveAt(2);

foreach(Person j in lp)
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

当我尝试执行上述代码时,会导致异常。

InvalidOperationException : 集合被修改;枚举操作可能无法执行。

我在互联网上找到了一些解决方案并尝试了它们。其中之一是,

foreach(Person j in lp.ToList())
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

但没有什么可以阻止异常。

有人可以帮忙吗?

c# collections

2
推荐指数
1
解决办法
2万
查看次数

集合被修改,枚举操作可能无法执行。统一

我目前正在制作一款 RTS 风格的游戏。我制作了这个战争迷雾脚本来让敌人隐形:

void Update () {
    foreach (GameObject enemy in enemies) {
        if (enemy == null) {
            enemies.Remove (enemy);
            continue;
        } else {
            Visible = false;
            foreach (GameObject vision in visions) {
                if (vision == null) {
                    visions.Remove (vision);
                    continue;
                } else {
                    Vector3 point = enemy.GetComponent<Collider> ().ClosestPoint (vision.transform.position);
                    float range = vision.GetComponent<FieldOfView> ().viewRadius;
                    float distance = Vector3.Distance (point, vision.transform.position);
                    if (distance <= range) {
                        Visible = true;
                        break;
                    }
                }
            }
            MeshRenderer render = enemy.GetComponent<MeshRenderer> ();
            if (Visible) …
Run Code Online (Sandbox Code Playgroud)

c# foreach list unity-game-engine

1
推荐指数
1
解决办法
2万
查看次数