编辑:这不是重复,我知道NullReferenceException意味着什么。
以下代码在空检查后立即给我一个“target”的NullReferenceException:
private Entity target;
private float newPathTimer;
private float attackTimer;
public override void Update(float deltaTime) {
attackTimer += deltaTime;
// Check for target
if (target != null) {
float distance = MathExtra.PointDistance(Entity.X, Entity.Y, target.X, target.Y);
设置“目标”的唯一地方:
public override void Receive(ICommand message) {
if (message is Attack) {
target = SystemMessager.SendQuery<Entity>(new GetEntity(((Attack)message).entityID));
newPathTimer = NEW_PATH_RATE;
}
if (message is FollowPath) {
if (!((FollowPath)message).pursuit) {
target = null;
}
}
}
所有对“目标”的引用:
如果它有所不同,此应用程序是一个接收和发送数据包到客户端的服务器。
另外,我不知道如何重现这个错误,它不会一直发生。
编辑:每次收到某个数据包时都会调用receive方法。我认为可能会在单独的线程上收到数据包导致此问题。
答案 0 :(得分:0)
您的问题似乎是target
字段周围缺少锁定或同步。
鉴于您已经说过,当收到数据包时,会在多个线程上调用它,那么只要您读取和写入数据包,就可以使用lock
来保护对它的访问。或者,您可能更有可能不打算共享此类的实例及其中的其他字段,因此您可能需要考虑更改这些实例的生命周期。