我有一个问题。我正在制作一个实用程序来生成过程生成的地图。我有一个房间游泳池,每个房间都放在一个房间的桌子上。我有一种方法可以将在桌子上走动的所有房间连接在一起,并连接相邻的房间。
我有一个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
,这意味着该条件正在另一个线程中进行修改。
如果您不知道其他线程如何或在何处修改对象,那么您似乎还有待解决的更大问题,因为您似乎不了解所使用的代码或框架。
如果或何时确实了解发生这种情况的原因和时间,则需要实现某种同步机制,或者(最好)指导不可变的实现。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句