【问题标题】:InvalidOperationException: out of sync. Caused by modifying a dictionary while iterating over it. Except i didn't modify itInvalidOperationException:不同步。由在迭代字典时修改字典引起的。除了我没有修改它
【发布时间】:2016-01-26 00:05:38
【问题描述】:

在这里,我在迭代之前复制了字典,它仍然给我这个错误。如果有人可以帮助我,那就太棒了。

IEnumerator HandleStaticObjects()
{
    handleStaticObjectsIsRunning = true;

    List<string> instantiatedObjects = new List<string>();

    Dictionary<string, staticObjectWaitingToBeInstantiated> currentStaticObjectsWaitingToBeInstantiated = staticObjectsWaitingToBeInstantiated;

    foreach (KeyValuePair<string, staticObjectWaitingToBeInstantiated> staticObject in currentStaticObjectsWaitingToBeInstantiated)
    {
        if (staticObject.Value.staticObject == null)
        {
            AssetBundleCreateRequest bundle = AssetBundle.LoadFromFileAsync(@"C:/gameAssets/" + staticObject.Value.name.Split('?')[0] + ".unity3d");
            UnityEngine.Debug.Log("loading " + staticObject.Value.name.Split('?')[0]);
            yield return bundle;
            AssetBundle assetBundle = bundle.assetBundle;
            var assetLoadRequest = assetBundle.LoadAssetAsync<GameObject>(staticObject.Value.name.Split('?')[0]);
            yield return assetLoadRequest;

            staticObject.Value.staticObject = assetLoadRequest.asset as GameObject;
            assetBundle.Unload(false);
        }
        staticObjects[staticObject.Key] = Instantiate(staticObject.Value.staticObject);
        staticObjects[staticObject.Key].transform.eulerAngles = staticObject.Value.eulerAngles;
        staticObjects[staticObject.Key].transform.position = staticObject.Value.position;
        staticObjects[staticObject.Key].transform.localScale = staticObject.Value.localScale;
        if (staticObjects[staticObject.Key].GetComponent<DataHolder>() == null)
        {
            staticObjects[staticObject.Key].AddComponent<DataHolder>();
        }  
        staticObjects[staticObject.Key].GetComponent<DataHolder>().objectName = staticObject.Value.name;

        instantiatedObjects.Add(staticObject.Key);
    }
    foreach (string instantiatedObject in instantiatedObjects)
    {
        staticObjectsWaitingToBeInstantiated.Remove(instantiatedObject);
    }
    handleStaticObjectsIsRunning = false;
}

堆栈跟踪:

InvalidOperationException: out of sync
System.Collections.Generic.Dictionary`2+Enumerator[System.String,CoOrdsHandler+staticObjectWaitingToBeInstantiated].VerifyState () (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:912)
System.Collections.Generic.Dictionary`2+Enumerator[System.String,CoOrdsHandler+staticObjectWaitingToBeInstantiated].MoveNext () (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:835)
CoOrdsHandler+<HandleStaticObjects>c__Iterator0.MoveNext () (at Assets/Scripts/CoOrdsHandler.cs:342)

【问题讨论】:

  • 你的问题陈述应该在问题的开头。让您的问题简短而巧妙,并始终正确格式化,以便其他人可以正确阅读。

标签: c# dictionary unity3d mono


【解决方案1】:

抱歉不能发表评论,或者我会,但你不是在制作副本,而是在创建对原件的引用。

改变:

Dictionary<string, staticObjectWaitingToBeInstantiated> currentStaticObjectsWaitingToBeInstantiated = staticObjectsWaitingToBeInstantiated;

Dictionary<string, staticObjectWaitingToBeInstantiated> currentStaticObjectsWaitingToBeInstantiated = new Dictionary<string, staticObjectWaitingToBeInstantiated> (staticObjectsWaitingToBeInstantiated);

How do I copy the content of a dictionary to an new dictionary in C#?

【讨论】:

  • 非常感谢!这是有道理的,游戏现在可以运行了。
  • 很高兴为您提供帮助。如果我的回答有效,请采纳,谢谢
猜你喜欢
  • 2011-10-10
  • 1970-01-01
  • 2021-07-01
  • 2013-02-22
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多