コード例 #1
0
        public async Task <Element> GetAsync(string id)
        {
            var lId = await _nrwl.AcquireReaderLockAsync($"{nameof(Files)}.{id}");

            var elemSearch = (await _elements.FindAsync(x => x.ID == id)).ToList();
            await _nrwl.ReleaseLockAsync($"{nameof(Files)}.{id}", lId);

            return(elemSearch.Count == 0 ? null : elemSearch.First());
        }
コード例 #2
0
        private static async Task <(bool success, ChunkMap map)> CreateNewElementAsync(IMongoCollection <ChunkMap> maps,
                                                                                       string id, NamedReaderWriterLock nrwl)
        {
            var map = new ChunkMap {
                ID = id, ChunksIDs = new List <string>(), Length = 0
            };
            var lId = await nrwl.AcquireReaderLockAsync($"{nameof(ChunkMap)}.{id}");

            using var session = await maps.Database.Client.StartSessionAsync();

            session.StartTransaction();
            try
            {
                if (id != null)
                {
                    if (!await(await maps.FindAsync(x => x.ID == id)).AnyAsync())
                    {
                        map.ID = id;
                    }
                    else
                    {
                        await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);

                        return(false, null);
                    }
                }

                await maps.InsertOneAsync(map);

                await session.CommitTransactionAsync();

                await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);

                return(true, map);
            }
            catch (Exception)
            {
                await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);
            }

            await session.AbortTransactionAsync();

            await nrwl.ReleaseLockAsync($"{nameof(ChunkMap)}.{id}", lId);

            return(false, null);
        }