2011-09-21 23 views
0

我想通过一个WCF数据服务(Singlton)公开一些端点,它将维护用于响应各个请求的数据集合。WCF数据服务+到期数据(定时器?)

理想情况下,我希望能够在一段时间后过期(删除)给定请求的内存中保存的数据。

存储的数据将用于构建(部分只是,因此开箱即用的缓存不正常)结果集返回给客户端。数据将来自API的对象,并且必须保存在内存中,而不是存储到存储器中。

我正在寻找方法来触发'清除'过程来检查过期的数据。在ctor中启动一个定时器似乎是一个糟糕的主意。它可以针对每个请求运行(启用单个并发),但这看起来过多,并且可能会在没有更多请求时将数据留在那里?

对这个问题的任何想法都表示赞赏。

回答

0

用系统计时器结束重新设计和托管Windows服务中的相关服务组件以清除所需的数据。

0

您需要某种计时器来定期运行清理过程。您可以根据请求触发,但这并不可取,因为您当然不应阻止对可能是长时间运行的清理过程的请求,并且因为您可能在请求之间有很长一段时间,这意味着请求可能会处理超出其寿命的数据。

一种选择是不通过使读取过滤器数据超出其使用期限而使清除过程不重要。例如,您可以使用内存数据库,如SQL Compact Edition或Sqlite。高速缓存的数据可能有一个时间戳列,然后读入高速缓存可能会查询,并始终按照不比X早的时间戳进行过滤。这样做会使不是关键以进行清理,而是优化内存真的应该发生的压力。 Sql只是给你简单的机制,按时间戳过滤。你可以在你自己的内存数据结构中做同样的事情。

就清理过程而言,您需要某种计时器或某些东西来踢它运行。在proc服务中启动WCF的过程也可以启动一个定时器,并定期调用缓存来清理它。如果在清理时调用清理函数,它就会返回。如果你使得清理不是严格的(如上所述),并且如果运行清理过程被忽略,那么每个请求都可能会被踢掉。

+0

嘿,感谢您的快速回复。我听到你在说什么,但不幸的是,我将要存储的对象不包含静态数据,因此将它们保存到数据库中(除非我对SQLCE/Lite的理解是离开的)不是一种选择,但存储对象的方式是没有任何问题。自定义容器类+ LINQ = :)。我的问题是过程的触发。正如你指出的那样,计时器将起作用。我了解到Timer会在不同的线程上启动它的处理程序,从而导致单个服务可能会出现争用状况,从而查看它的持续数据收集... – Kyle