我有一个问题。我正在制作一个实用程序来生成过程生成的 map 。
我有一个房间游泳池,每个房间都放在一个房间的 table 上。我有一种方法可以将在 table 上走动的所有房间连接在一起,并连接相邻的房间。
我有一个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
最佳答案
该问题最有可能是由于竞赛情况而引起的。您可以轻松检查是否是这种情况,如下所示:
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
,这意味着它正在另一个线程中被修改。如果您不知道其他线程如何或在何处修改对象,那么您似乎还有待解决的更大问题,因为您似乎不了解所使用的代码或框架。
如果或何时确实了解发生这种情况的原因和时间,则需要实现某种同步机制,或者(最好)指导不可变的实现。