/// <summary> /// Wait for an instance to become available and then get it. /// </summary> public async Task <IPoolToken> GetAsync() { await _objectsAvailable.WaitAsync(); SemaphoreSlim semaphoreToBeReleased = _objectsAvailable; try { T obj; if (!_objects.TryTake(out obj)) { throw ContractUtilities.AssertFailure("Semaphore was available, but pool is empty."); } var token = new BoundedPoolToken(obj, this); semaphoreToBeReleased = null; return(token); } finally { if (semaphoreToBeReleased != null) { _objectsAvailable.Release(); } } }
private async Task<bool> ExecuteReaderImplAsync(string command, Func<SQLiteDataReader, ReadResponse> readFunc, params SQLiteParameter[] parameters) { using (var cmd = new SQLiteCommand(command, Connection)) { cmd.Parameters.AddRange(parameters); #pragma warning disable AsyncFixer02 // Long running or blocking operations under an async method using (SQLiteDataReader reader = cmd.ExecuteReader()) { var done = false; while (!done && await reader.ReadAsync()) { var response = readFunc(reader); switch (response) { case ReadResponse.ContinueReading: continue; case ReadResponse.StopReadingIgnoreFurther: done = true; break; case ReadResponse.StopReadingAssertEnd: Contract.Assert(!reader.Read()); #pragma warning restore AsyncFixer02 // Long running or blocking operations under an async method break; default: throw ContractUtilities.AssertFailure("unexpected ReadResponse"); } } } } return true; }