C# InvalidOperationException: out of sync

InvalidOperationException: out of sync
System.Collections.Generic.Dictionary`2+Enumerator[System.String,GameDataTable].VerifyState () (at /Applications/buildAgent/work/b59ae78cff80e584/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:912)
System.Collections.Generic.Dictionary`2+Enumerator[System.String,GameDataTable].MoveNext () (at /Applications/buildAgent/work/b59ae78cff80e584/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:835)
System.Collections.Generic.Dictionary`2+KeyCollection+Enumerator[System.String,GameDataTable].MoveNext () (at /Applications/buildAgent/work/b59ae78cff80e584/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:1028)
GameDataManager.OnApplicationQuit () (at Assets/Script/Kabod/GameDataManager.cs:25)

 유니티3D로 작업중 어플을 종료시 위와같이 에러가 발생했습니다. 유니티3D보다는 C#쪽 내용인데요,

foreach (string strKey in this.dicGameDataTable.Keys)
{
    RemoveDataTable(strKey);
}
 게임 종료시 기존에 가지고 있던 Dictionary의 key값에 해당하는 값을 지우려고 시도하다가 발생했습니다. MSDN을 참고해보면 foreach문은 컬렉션을 반복 실행하여 원하는 정보를 얻는 용도로는 사용할 수 있지만 예측할 수 없는 부작용을 방지하면서 소스 컬렉션의 항목을 추가하거나 제거하는 용도로는 사용할 수 없습니다. 소스 컬렉션에서 항목을 추가하거나 제거해야 한다면 for 루프를 사용하십시오. 라고 합니다.

 현재 키로 사용하는게 1개인데 지우고나서 다시 빈 딕셔너리에서 가져오다보니 MoveNext에서 에러가 발생하는 것 같습니다. 어찌보면 당연한거죠. foreach 내부적으로 어떻게 되어있는지 모르겠지만 c++ stl 처럼 iterator을 검사해주지는 않는 것 같습니다. 사실 foreach를 사용해 패치 목록에서 패치를 받는다던지 find를 한다던지 이런 기존에 만들어놓은 자료구조에서 순차적으로 요소를 접근할 때는 아무이상없이 잘 사용하고 있었습니다. MSDN대로 추가하거나 삭제하면 안되겠네요. ctrl+c ctrl+v가 문제네요 ㅎ;
this.dicGameDataTable.Clear();
 해결은 간단합니다. Clear() 해주면 되는거죠.

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

goorm IDE에서 node.js 프로젝트로 Hello World Simple Server 만들어 띄워보기

애드센스 수익을 웨스턴 유니온으로 수표대신 현금으로 지급 받아보자.