客户轮询服务以进行活动

时间:2012-03-12 15:38:39

标签: c# .net wcf web-services windows-services

我有一个持续执行计算任务的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中的旧条目。想法?

2 个答案:

答案 0 :(得分:1)

对于您的第一个问题,请在每次回复时返回服务器的时间,并让客户端在发出请求时发送此时间戳,而不是他们自己的时间。

对于第二个问题:如果计算/步骤可能以不同的速率生成消息,而不是为每组更新设置固定大小的缓冲区,我会坚持每隔一段时间运行一次清理作业,删除消息早于[客户端ping间隔的一小部分]。

答案 1 :(得分:0)

对于你的第二个问题,我将实现一个循环数组结构,它将自动覆盖旧条目。如果写入消息的速率是不变的,这应该很容易。如果它是可变的,你将必须根据每5秒周期的预期最大消息数来确定数组的大小。