예제 #1
0
        public Task GateThrowsTimeoutException()
        {
            var gate = new SemaphoreSlim(initialCount: 0);

            return(Assert.ThrowsAsync <TimeoutException>(
                       () => gate.GatedOperationAsync((timeWaiting, currentCount) => BoolResult.SuccessTask, CancellationToken.None, TimeSpan.FromMilliseconds(10))));
        }
예제 #2
0
        public Task GateGetsCancelledProperly()
        {
            var gate = new SemaphoreSlim(initialCount: 0);
            var cts  = new CancellationTokenSource();
            var task = Assert.ThrowsAsync <OperationCanceledException>(
                () => gate.GatedOperationAsync((timeWaiting, currentCount) => BoolResult.SuccessTask, cts.Token, TimeSpan.FromSeconds(1)));

            cts.Cancel();
            return(task);
        }
예제 #3
0
        private Task <TResult> PerformPutFileGatedOperationAsync <TResult>(OperationContext operationContext, Func <Task <TResult> > func)
        {
            return(_putFileGate.GatedOperationAsync((timeWaiting) =>
            {
                if (timeWaiting > Settings.PutFileWaitWarning)
                {
                    Tracer.Info(operationContext, $"Spent {timeWaiting} waiting for PutFile gate, exceeding deadline of {Settings.PutFileWaitWarning}");
                }

                return func();
            }, operationContext.Token));
        }
예제 #4
0
        private Task <PutResult> PerformPutFileGatedOperationAsync(OperationContext operationContext, Func <Task <PutResult> > func)
        {
            return(_putFileGate.GatedOperationAsync(async(timeWaiting) =>
            {
                var gateOccupiedCount = Settings.MaximumConcurrentPutFileOperations - _putFileGate.CurrentCount;

                var result = await func();
                result.Metadata = new PutResult.ExtraMetadata()
                {
                    GateWaitTime = timeWaiting,
                    GateOccupiedCount = gateOccupiedCount,
                };

                return result;
            }, operationContext.Token));
        }
예제 #5
0
        public Task GateAllowsForOperationToComplete()
        {
            var gate = new SemaphoreSlim(initialCount: 1);

            return(gate.GatedOperationAsync((timeWaiting, currentCount) => BoolResult.SuccessTask, CancellationToken.None, TimeSpan.FromSeconds(10)).ShouldBeSuccess());
        }