このパターンを読んだことがありますが、うまくいかないことがわかりました。foreach の項目が変更されたというまれな例外が発生します。
lock (mylist) { foreach(var a in myList) {}
myList = new List<>() (または myList.Clear() ) }
私もこれを試しました
foreach(var a in myList.ToList() ) { }
そして、それも例外を生成しました。このスレッドには他にもいくつかのパターンが説明されていますが、上記のパターンが機能しない理由を確認/理解したいので、リストを適切にロックする方法について少し読みました。例外は頻繁には発生しません。非常にまれであり、その時点でメモリ リークも発生していました。
1. myList を変更するたびにロックを使用する必要がありますか? それとも、ロックによって mylist を編集できなくなりますか? これが混乱の元かもしれません。
2.
lock mylist とキャストと syncroot の使用に違いはありますか?
こちらをご覧ください