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