public void InsertOrUpdateBlock(Data.BlockData block) { lock (BlockInsertOrUpdateQueue) { BlockInsertOrUpdateQueue.Enqueue(block); TerrainCommunication.SendBlockUpdate(block); } }
private bool DequeueBlock(out string error) { error = null; try { Data.BlockData block = null; lock (BlockInsertOrUpdateQueue) { try { block = BlockInsertOrUpdateQueue.Dequeue(); } //empty queue catch (InvalidOperationException) { } } if (block != null) { lock (block) { bool enqueueAgain; Data.ChunkData chunk = ChunkByMemoryID(block.ChunkMemoryID); bool chunkSaved; lock (chunk) { chunkSaved = chunk.DataBaseID > -1; } //verifica se o chunk foi salvo no banco if (chunkSaved) { if (block.DataBaseID <= -1) { enqueueAgain = (!DAO.Terrain.BlockData.Insert(block) && block.DataBaseID <= -1); } else { enqueueAgain = (!DAO.Terrain.BlockData.Update(block)); } } else// aguarda na fila ate que seu chunk esteja salvo no banco de dados { enqueueAgain = true; } if (enqueueAgain) { lock (BlockInsertOrUpdateQueue) { //try again later BlockInsertOrUpdateQueue.Enqueue(block); } } } } return(true); } catch (Exception ex) { error = ex.ToString(); return(false); } }