Exemple #1
0
    public static void RespectsMaxConcurrency()
    {
        var stack = new StackPolicy(Options.Create(new QueuePolicyOptions
        {
            MaxConcurrentRequests = 2,
            RequestQueueLimit     = 2,
        }));

        var task1 = stack.TryEnterAsync();

        Assert.True(task1.IsCompleted);

        var task2 = stack.TryEnterAsync();

        Assert.True(task2.IsCompleted);

        var task3 = stack.TryEnterAsync();

        Assert.False(task3.IsCompleted);
    }
Exemple #2
0
    public async Task BaseFunctionality()
    {
        var stack = new StackPolicy(Options.Create(new QueuePolicyOptions
        {
            MaxConcurrentRequests = 1,
            RequestQueueLimit     = 2,
        }));

        var task1 = stack.TryEnterAsync();

        Assert.True(task1.IsCompleted);
        Assert.True(await task1);

        var task2 = stack.TryEnterAsync();

        Assert.False(task2.IsCompleted);

        stack.OnExit();

        Assert.True(await task2);

        stack.OnExit();
    }
Exemple #3
0
        public static void ExitRequestsPreserveSemaphoreState()
        {
            var stack = new StackPolicy(Options.Create(new QueuePolicyOptions {
                MaxConcurrentRequests = 1,
                RequestQueueLimit     = 2,
            }));

            var task1 = stack.TryEnterAsync();

            Assert.True(task1.IsCompleted && task1.Result);

            var task2 = stack.TryEnterAsync();

            Assert.False(task2.IsCompleted);

            stack.OnExit();  // t1 exits, should free t2 to return
            Assert.True(task2.IsCompleted && task2.Result);

            stack.OnExit();  // t2 exists, there's now a free spot in server

            var task3 = stack.TryEnterAsync();

            Assert.True(task3.IsCompleted && task3.Result);
        }
    public async Task OldestRequestOverwritten()
    {
        var stack = new StackPolicy(Options.Create(new QueuePolicyOptions
        {
            MaxConcurrentRequests = 1,
            RequestQueueLimit     = 3,
        }));

        var task1 = stack.TryEnterAsync();

        Assert.True(task1.IsCompleted);

        var task2 = stack.TryEnterAsync();

        Assert.False(task2.IsCompleted);
        var task3 = stack.TryEnterAsync();

        Assert.False(task3.IsCompleted);
        var task4 = stack.TryEnterAsync();

        Assert.False(task4.IsCompleted);

        // It should drop the oldest item, but instead it fails to add the new one.
        // https://github.com/dotnet/runtime/issues/62817
        var task5 = stack.TryEnterAsync();

        Assert.True(task5.IsCompleted);
        Assert.False(await task5);

        // Should have been pushed out of the stack
        // Assert.False(await task2);

        Assert.False(task2.IsCompleted);
        Assert.False(task3.IsCompleted);
        Assert.False(task4.IsCompleted);
    }
Exemple #5
0
 public ResettableBooleanCompletionSource(StackPolicy queue)
 {
     _queue = queue;
     _valueTaskSource.RunContinuationsAsynchronously = true;
 }