首先,我将谈论一些遗留代码,我们正试图尽可能避免更改它。另外,我对Windows服务和WCF的体验有点受限,所以有些问题可能有些新手。只是在问题之前给出一些背景信息。
我们有一个循环的现有服务。它通过数据库调用检查它是否有要处理的记录。如果它没有找到任何记录,它会休眠30秒,然后再次唤醒再次尝试。
我想在此服务中添加一个入口点,除了处理数据库中的记录外,还允许我将记录传递给此服务。所以基本的流程就是。
循环
*从数据库中读取记录
*如果没有来自DB的记录,则处理通过入口点传入的任何记录
*根本没有记录,睡30秒。
我担心的是这个。是否可以在一个服务中实现这一点,以便我有循环过程,但我也允许调用随时进入,并将其他项添加到可在循环内处理的队列中。我关注的是并发性,并使循环和监听器不会互相踩踏。
我知道这个问题可能措辞不对,但我处于新的一面。任何帮助将不胜感激。
答案 0 :(得分:3)
我关注的是并发性,并使循环和监听器不会互相踩踏。
如果您正确同步访问权限,这不应该是一个问题。
最简单的选项可能是使用线程安全集合(例如ConcurrentQueue<T>
)来保存要处理的项目。 WCF服务可以毫无顾虑地将项目添加到集合中,您的下一个处理步骤将处理它。在这种情况下,同步实际上是最小的,因为队列已经完全是线程安全的。
答案 1 :(得分:0)
除了Reed的优秀答案之外,您可能希望将记录保留在MSMQ queue中,以防止您的服务在关闭,重新启动或崩溃服务时丢失记录。