private bool DequeueChunk(out string error) { error = null; try { Data.ChunkData chunk = null; lock (ChunkInsertQueue) { try { chunk = ChunkInsertQueue.Dequeue(); } //empty queue catch (InvalidOperationException) { } } if (chunk != null) { lock (chunk) { if (!DAO.Terrain.ChunkData.Insert(chunk) && chunk.DataBaseID <= -1) { lock (ChunkInsertQueue) { //try again later ChunkInsertQueue.Enqueue(chunk); } } else { //atualiza index de base de dados adicionando o novo id var dataBaseHashKey = chunk.DataBaseID.GetHashCode(); var dataBaseChunks = this.ChunksByDataBaseID.GetOrAdd(dataBaseHashKey, new List <Data.ChunkData>()); lock (dataBaseChunks) { dataBaseChunks.Add(chunk); } } } } return(true); } catch (Exception ex) { error = ex.ToString(); return(false); } }