1. ホーム
  2. マルチスレッド

コレクションが変更されたため、列挙操作が実行できない場合がある Error

2022-02-25 21:21:08
<パス

C#がエラーを報告する。Collection was modified; enumeration operation may not execute [resolved].

この例外は、Listのトラバーサル中に、他の場所でListに変更(追加、削除、変更)が行われたために、InvalidOperationExceptionが発生することが多いようです。

これは主に、複数のスレッドが同じListに対して操作を行った場合に発生します。この問題を回避するには、次の例のように、操作にロックを追加し、ロックを取得したときだけ対応する操作を実行するようにします。

    public class LockListInMultThread
    {
        private List<string> chains = new List
();
        private object lockobj = new object();

        public void ReadAndDoXxx()
        {
            lock(lockobj)
            {
                chains.ForEach(s =>
                {
                    // todo ....
                    Console.Out.WriteLine("=> " + s);
                });
            }
        }
        
        // may be called in a different thread
        public void AddNew(string s)
        {
            lock (lockobj)
            {
            	// other modifications
                chains.Add(s);
            }
        }
    }


プロテストあり。

もし役に立ったと思ったら、後ろの学生のために、いいね!やコメントをお願いします。