我遇到了问题。我正在制作一个实用程序来制作程序生成的地图。 我有一个房间游泳池,每个房间都摆放在一张房间的桌子上。我有一种方法将所有房间连接在一起,走在桌子上并连接相邻的房间。
我有enum
,其中包含房间类型:
public enum RoomType
{
Default = 0,
Building,
Boss,
Item,
Standard,
Start,
}
在连接方法中,我检查邻域以查看它是什么类型的房间:
if (neighbourhood[2, 1] != null)
{
if (firstLevel.isOn)
{
if (neighbourhood[2,1].TypeOfRoom == RoomType.Start)
{
roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT)
}
}
else if (neighbourhood[2,1].TypeOfRoom != RoomType.Boss)
roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT);
}
但是当我检查房间的类型是否为Start
时,它始终是true
并且会添加连接。
我不知道为什么会这样。
我在哪里设置TypeOfRoom: img3
答案 0 :(得分:4)
问题很可能是由于竞争条件造成的。您可以按如下方式轻松检查是否是这种情况:
if (neighbourhood[2, 1] != null)
{
if (firstLevel.isOn)
{
var typeOfRoom = neighbourhood[2,1].TypeOfRoom; //store type in a local variable
if (typeOfRoom == RoomType.Start) //check against local copy
{
roomGrid[x, y].AddConnection(neighbourhood[2, 1], Location.RIGHT)
}
}
...
}
现在您将看到if
条件完全正常,但neighbourhood[2,1].TypeOfRoom
不等于typeOfRoom
,这意味着它正在另一个线程中进行修改。
如果你不知道你的对象被其他线程修改的方式或位置,那么你就有更大的问题要解决,因为你似乎不理解你正在使用的代码或框架。
如果做了解为什么以及何时发生这种情况,您将需要实现一些同步机制或引导(优先)向不可变的实现。
答案 1 :(得分:3)
您在屏幕截图中显示的内容以及您所描述的内容听起来不可能。当发生这种情况时,通常是因为应用程序是多线程的。这在一个线程上是不可能的。但是当它正在执行另一个线程时正在修改值。
同时,您可能还会无意中将对同一对象的引用传递给多个函数。
但绝对要检查涉及线程,任务或并行函数调用的任何内容。或者,如果这是在Web环境中运行,请查看是否有多个请求可以访问共享数据。