Monday, May 2, 2016

Time based Throttler

Time based throttler;


    using System;
    using System.Threading.Tasks;
    using Interfaces;

    public class TimeboundThrottler : IThrottler
    {
        private TaskQueue queue;
        private int _requestsPerSecond;

        public int ConcurrentOperations
        {
            get
            {
                return _requestsPerSecond;
            }
        }

        public TimeboundThrottler(int requestsPerSecond)
        {
            Validator.IsPositive(requestsPerSecond, CallerDetailsExtensions.GetMemberName(() => requestsPerSecond));

            this._requestsPerSecond = requestsPerSecond;
            queue = new TaskQueue(requestsPerSecond);
        }

        public Task<T> Enqueue<T>(Func<Task<T>> taskGenerator)
        {
            TaskCompletionSource<T> tcs = new TaskCompletionSource<T>();
            var unused = queue.Enqueue(() =>
            {
                tcs.Match(taskGenerator());
                return Task.Delay(TimeSpan.FromSeconds(1));
            });
            return tcs.Task;
        }

        public Task Enqueue(Func<Task> taskGenerator)
        {
//TaskCompletionSource will attach source of Task to the edstination. So TaskCompletionSource is matched to the taskGenerator.
//when the function comes out of the queue, TaskCompletionSource will be responsible for calling the function taskGenerator which will enerate Task
            TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
            var unused = queue.Enqueue(() =>
            {
                tcs.Match(taskGenerator());
                return Task.Delay(TimeSpan.FromSeconds(1));
            });
            return tcs.Task;
        }
    }

No comments:

Post a Comment