Мне нужно ограничить время выполнения обработчиков.
При чём в одном обработчике может быть много команд и хотелось бы прекратить выполнения по достижении максимального времени в заданном промежутке.
Псевдокод:
class ExecutionLimiter
{
// maxExecutionTime - максимально допустимое время работы
// executionPeriod - окно времени для измерения времени выполнения
public ExecutionLimiter(Action[] actions, int maxExecutionTime, int executionPeriod)
{
_actions = actions
}
// время начала -> время выплонения
Dictionary<DateTime, int> _previousEecutionTimes;
DoActions()
{
clearOldMeasurements();
// проверка что можно выполнять действия
if(_previousExecutionTimes.Sum() >= maxExecutionTime) return;
foreach(var action in actions)
{
// выполняем действие и записываем сколько времени заняло
var startAction = Date.Now;
action();
var executionTime = Data.Now - startAction;
// записываем сколько выполнились
_previousEecutionTimes.Add(executionTime);
// удаляем старые данные
clearOldMeasurements();
// если больше чем положено, выходим.
if(_previousEecutionTimes.Sum() >= maxExecutionTime)
{
break;
}
}
}
// удаляем старые данные
clearOldMeasurements()
{
var now = Date.Now;
foreach(var kv in _previousExecutionTimes) { if(kv.Key < now - _executionPreiod) _previousExecutionTimes.Remove(kv.Key);
}
}
Может есть идеи как организовать такое через Rx если вообще стоит?