C++:世界上唯一能让程序员在配置环境|

香菇0_0

园龄:2年7个月粉丝:10关注:1

【Unity】解决InvalidOperationException: Collection was modified; enumeration operation may not execute.

        今天在Unity运行时遇到了InvalidOperationException: Collection was modified; enumeration operation may not execute。

        打开代码后发现用到了Dictionary数据结构,但也并没有在foreach循环中修改它,只是在Update中调用了它而已。

foreach (var item in statusTimers)
{
	var status = item.Key;
	statusTimers[status] -= deltaTime;
	if (statusTimers[status] <= 0f)
	{
		if (statusesToRemove == null)
		{
			statusesToRemove = new Dictionary<CharacterStatusType, float>();
		}
		statusesToRemove.Add(status, statusTimers[status]);
	}
}

        经过仔细检查多个文件,我在一个携程中调用了一个增添方法,这个方法对Dictionary进行了添加操作,而此时另一边Update正处于foreach遍历当中,所以发生冲突产生错误。

private IEnumerator CastRoutine()
{
	// ...
	target._stateManager.AddStatus(_addStatus, _statusTime);
}

public void AddStatus(CharacterStatusType status, float duration)
{
	if (!statusTimers.ContainsKey(status))
	{
		statusTimers.Add(status, duration);
		UpdateCurrentStatus();
	}
	else
	{
		// 如果已存在该异常状态,保留较长的持续时间
		float existingDuration = statusTimers[status];
		statusTimers[status] = Mathf.Max(existingDuration, duration);
		UpdateCurrentStatus();
	}
}

        解决办法:Unity提供了线程安全的集合类ConcurrentDictionary,能够在携程中正确处理对字典的并发访问。把Dictionary替换掉即可。

本文作者:香菇0_0

本文链接:https://www.cnblogs.com/Xiang-gu/p/18601775

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   香菇0_0  阅读(126)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.