1

この例外が何十億回も対処されていることは知っていますが、私の状況は少し異なります (と思います)。

とにかく、私は ProtoBuf - Net を使用してオブジェクトを保存およびロードしています。逆シリアル化しようとしているオブジェクトのリストがありますが、壊れ続けています(ここに来ます):

Collection was modified; enumeration operation may not execute.

繰り返しますが、ここで50回ほど質問されたのを見たので、50回申し訳ありませんが、コードは次のとおりです。

public void Load(){
            using (var file = 
                File.Exists(Application.StartupPath + @"\TestFile.scn") ? 
                File.OpenRead("TestFile.scn") : 
                null){
                if (file != null){
                    this._tlpGrid.Controls.Clear();
                    this.Scenes = Serializer.Deserialize<List<GraphicsPanel>>(file);
                    foreach(GraphicsPanel gp in this._lgpScenes)
                        this.AddScene(gp);
                }
            }
}

なぜその例外がスローされるのですか?間違っている場合、これを行う適切な方法は何ですか?

編集: AddScene メソッドがリストを変更していることがわかりました。それは正しいです: オリジナル:

    public void AddScene(GraphicsPanel Scene){
        this._tlpGrid.Controls.Add(Scene);
        this.Scenes.Add(Scene);
    }

変更:

    public void AddScene(GraphicsPanel Scene){
        this._tlpGrid.Controls.Add(Scene);
        if (!this.Scenes.Contains(Scene))
            this.Scenes.Add(Scene);
    }

質問が回答されました。どうもありがとうございました。

4

1 に答える 1

1

したがって、明らかに問題は、リストを変更するために呼び出していたメソッドが、リストを繰り返し処理している間にリストを変更していたことです。それは明らかだったはずですが、私はそれを完全に見逃していました。指摘してくれてありがとう、リー。例外をスローするメソッドのコード:

public void Load(){
            using (var file = 
                File.Exists(Application.StartupPath + @"\TestFile.scn") ? 
                File.OpenRead("TestFile.scn") : 
                null){
                if (file != null){
                    this._tlpGrid.Controls.Clear();
                    this.Scenes = Serializer.Deserialize<List<GraphicsPanel>>(file);
                    foreach(GraphicsPanel gp in this._lgpScenes)
                        this.AddScene(gp);
                }
            }
}

そして、問題を引き起こした方法 (前):

public void AddScene(GraphicsPanel Scene){
    this._tlpGrid.Controls.Add(Scene);
    this.Scenes.Add(Scene);
}

以降:

public void AddScene(GraphicsPanel Scene){
    this._tlpGrid.Controls.Add(Scene);
    if (!this.Scenes.Contains(Scene))
        this.Scenes.Add(Scene);
}

辛抱強く明白なことを指摘してくれてありがとう。

于 2013-07-23T16:17:09.287 に答える