public async Task ShouldWaitForLockOnSameKey() { var cts = new CancellationTokenSource(); var server = new LockServer <string>(cts.Token); var concurrentCount = 0; async Task test() { await using var _ = await server.GetLock("test"); await Task.Delay(50); var newValue = Interlocked.Increment(ref concurrentCount); newValue.ShouldBe(1); await Task.Delay(50); newValue = Interlocked.Decrement(ref concurrentCount); newValue.ShouldBe(0); }; await Task.WhenAll(test(), test()); concurrentCount.ShouldBe(0); cts.Cancel(); await server.Task; }
public async Task ShouldNotWaitForLockOnDifferentKey() { var cts = new CancellationTokenSource(); var server = new LockServer <string>(cts.Token); var concurrentCount = 0; async Task test(string key) { await using var _ = await server.GetLock(key); Interlocked.Increment(ref concurrentCount); await Task.Delay(50); Thread.MemoryBarrier(); concurrentCount.ShouldBe(2); Interlocked.Decrement(ref concurrentCount); }; await Task.WhenAll(test("test1"), test("test2")); concurrentCount.ShouldBe(0); cts.Cancel(); await server.Task; }
public void Setup() { Cts = new CancellationTokenSource(); LockServer = new LockServer <int>(Cts.Token); }