我有一个持续执行计算任务的Windows服务。作为单个计算任务的一部分,有多个计算步骤。
此服务需要记录/跟踪计算任务和步骤,以便多个客户可以轮询和观察活动。
为了满足此要求,我在我的服务中添加了一个简单的Dictionary<Guid, List<string>>
(_activity
)来收集活动消息。关键是代表Guid
的{{1}},值为CalculationTask.Id
,用于保存各个计算步骤中的消息。
我天真地为客户端调用的服务添加了一个方法(通过wcf)来轮询活动消息。客户端会传递List<string>
以试图告诉服务,“在我上次投票后向我提供所有邮件”...
lastPolledTimeStamp
以下是我的问题和疑问:
(1)当客户端和服务在不同的计算机上时,尝试按日期/时间比较过滤结果将不起作用。每次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();
}
被调用时,我都无法简单地返回_activity
中的所有内容 - 数据太多了。必须有某种过滤。我还有其他选择吗?
(2)另一个“问题”是知道何时可以删除GetActivity
字典中的键/值对。客户端每5秒轮询一次。我希望将键/值对保持足够长的时间,以便客户端有机会获取它...也许我应该包含另一个执行的计时器来定期清理_activity
中的旧条目。想法?
答案 0 :(得分:1)
对于您的第一个问题,请在每次回复时返回服务器的时间,并让客户端在发出请求时发送此时间戳,而不是他们自己的时间。
对于第二个问题:如果计算/步骤可能以不同的速率生成消息,而不是为每组更新设置固定大小的缓冲区,我会坚持每隔一段时间运行一次清理作业,删除消息早于[客户端ping间隔的一小部分]。
答案 1 :(得分:0)
对于你的第二个问题,我将实现一个循环数组结构,它将自动覆盖旧条目。如果写入消息的速率是不变的,这应该很容易。如果它是可变的,你将必须根据每5秒周期的预期最大消息数来确定数组的大小。