public async Task RaiseAndLower() { var asyncSemaphore = new NexusAsyncSemaphore(); await asyncSemaphore.RaiseAsync(); asyncSemaphore.Lower(); }
public async Task VerifyNoParallelism() { var started1 = false; var done1 = false; var started2 = false; var asyncSemaphore = new NexusAsyncSemaphore(); var task1 = asyncSemaphore.ExecuteAsync(async() => { started1 = true; await Task.Delay(TimeSpan.FromMilliseconds(10)); done1 = true; }); var task2 = asyncSemaphore.ExecuteAsync(async() => { started2 = true; await Task.Delay(TimeSpan.FromMilliseconds(10)); }); while (!started1) { await Task.Delay(TimeSpan.FromMilliseconds(1)); } while (!task1.IsCompleted && !done1) { UT.Assert.IsFalse(started2); await Task.Delay(TimeSpan.FromMilliseconds(1)); } await Task.WhenAll(task1, task2); }
public Task VerifyCancellationWorks() { var tokenSource = new CancellationTokenSource(); var asyncSemaphore = new NexusAsyncSemaphore(TimeSpan.FromDays(1)); var task = asyncSemaphore.ExecuteAsync((t) => Task.Delay(TimeSpan.FromDays(1), t), tokenSource.Token); tokenSource.Cancel(); // 10ms grace period for task to finish try { task.Wait(TimeSpan.FromMilliseconds(10)); UT.Assert.IsTrue(task.IsCompleted, "The cancellation token did not affect the execution."); } catch (Exception e) { // Expects a TaskCanceledException if (!(e is TaskCanceledException) && !(e is AggregateException && e.InnerException is TaskCanceledException)) { UT.Assert.Fail($"Unexpected exception: {e}"); } } return(Task.CompletedTask); }
public async Task VerifyCannotLowerTwice() { var asyncSemaphore = new NexusAsyncSemaphore(); await asyncSemaphore.RaiseAsync(); asyncSemaphore.Lower(); asyncSemaphore.Lower(); }
private static async Task ConnectThreadSafeAsync(IDbConnection connection, TimeSpan?connectTimeout, CancellationToken cancellationToken) { if (connection.State == ConnectionState.Open) { return; } var semaphore = new NexusAsyncSemaphore(); await semaphore.ExecuteAsync(ct => ConnectAsync(connection, connectTimeout, ct), cancellationToken); }
public Task VerifyNoWaitTimeAsync() { var done = false; var tokenSource = new CancellationTokenSource(); var asyncSemaphore = new NexusAsyncSemaphore(TimeSpan.FromDays(1)); var task = asyncSemaphore.ExecuteAsync(() => { done = true; return(Task.CompletedTask); }, tokenSource.Token); // 10ms grace period for ExecuteAloneAsync() to finish task.Wait(TimeSpan.FromMilliseconds(10)); tokenSource.Cancel(); UT.Assert.IsTrue(done, "It took too long time for the lambda method to be executed."); return(Task.CompletedTask); }
public void VerifyCannotLowerFirst() { var asyncSemaphore = new NexusAsyncSemaphore(); asyncSemaphore.Lower(); }