2017-01-17 4 views
-1

編集:これは複製ではなく、NullReferenceExceptionの意味を知っています。C#サーバー:ヌルチェック直後のNullReferenceException

次のコードは、右のヌルチェックの後、私に「ターゲット」のためとNullReferenceExceptionを与えている: "に

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; 
     } 
    } 
} 

すべての参照を:「目標」が設定されているだけの場所に

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); 

「ターゲット:

enter image description here

が落札した場合このアプリケーションは、クライアントにパケットを送受信するサーバーです。

また、このエラーを再現する方法はわかりませんが、常に発生するわけではありません。

編集:receiveメソッドは、特定のパケットを受信するたびに呼び出されます。私はパケットがこの問題を引き起こす別のスレッドで受け取られるかもしれないと思う。

+1

'target'が他のスレッドによって突然変異している可能性はありますか?それはすべての時間に起こるわけではない、これは競合状態のように聞こえる。 – Stuart

+0

nullとvoid、メッセージは何ですか? – ArthNRick

+0

ロックを試してみよう – Nkosi

答えて

0

targetフィールドの周囲にロックや同期がない問題が発生しています。

パケットが受信されたときに複数のスレッドで呼び出されているとすれば、読み書きするたびにアクセスを守るためにlockを使用できます。または、おそらく、このクラスのインスタンスとその中の他のフィールドを共有しようとしていない可能性が高いため、これらのインスタンスのライフタイムを変更する必要があります。

関連する問題