Exemplo n.º 1
0
 public void InsertOrUpdateBlock(Data.BlockData block)
 {
     lock (BlockInsertOrUpdateQueue)
     {
         BlockInsertOrUpdateQueue.Enqueue(block);
         TerrainCommunication.SendBlockUpdate(block);
     }
 }
Exemplo n.º 2
0
        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);
            }
        }