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;
}
}
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