У меня есть служба Windows, которая постоянно выполняет расчетные задачи. В рамках одной вычислительной задачи выполняется несколько этапов расчета.
Эта служба требуется для регистрации / отслеживания задач и шагов расчета, чтобы несколько клиентов могли опрашивать и наблюдать за активностью.
Чтобы выполнить это требование, я добавил простой Dictionary<Guid, List<string>>
(_activity
) к своему сервису, который собирает сообщения об активности. Ключ Guid
представляет CalculationTask.Id
, а значение List<string>
содержит сообщения от отдельных этапов расчета.
Я наивно добавил метод к службе, который вызывается клиентами (через wcf) для опроса сообщений об активности. Клиент передал бы lastPolledTimeStamp
, пытаясь сообщить службе: « передайте мне все ваши сообщения с момента последнего опроса » ...
private readonly Dictionary<Guid, List<string>> _activity = new Dictionary<Guid, List<string>>();
public List<string> GetActivity(DateTime lastPolledTimeStamp)
{
var snapshot = _activity.ToList();
return snapshot.SelectMany(x => x.Value)
.Where(x => x.TimeStamp > lastPolledTimeStamp)
.OrderBy(x => x.TimeStamp)
.ToList();
}
Вот мои проблемы и вопросы:
(1) Когда клиент и служба находятся на разных компьютерах, попытки фильтровать результаты по сравнению даты и времени не будут работать. И я не могу просто вернуть все в _activity
каждый раз, когда вызывается GetActivity
- слишком много данных. Должна быть какая-то фильтрация. Какие еще варианты у меня есть?
(2) Еще одна «проблема» - знать, когда можно удалить пару ключ / значение в словаре _activity
. Клиенты опрашивают каждые 5 секунд. Я хочу хранить пару ключ / значение достаточно долго, чтобы у клиентов была возможность подобрать ее ... Возможно, мне следует включить другой таймер, который выполняется для периодической очистки старых записей в _activity
. Мысли?