コード例 #1
0
        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;
        }
コード例 #2
0
        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;
        }
コード例 #3
0
ファイル: Program.cs プロジェクト: g-un--/LockServer
 public void Setup()
 {
     Cts        = new CancellationTokenSource();
     LockServer = new LockServer <int>(Cts.Token);
 }