我有一个问题。我正在制作一个实用程序来生成过程生成的 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,这意味着它正在另一个线程中被修改。

如果您不知道其他线程如何或在何处修改对象,那么您似乎还有待解决的更大问题,因为您似乎不了解所使用的代码或框架。

如果或何时确实了解发生这种情况的原因和时间,则需要实现某种同步机制,或者(最好)指导不可变的实现。

09-17 09:57