【问题标题】:Windows service threading with looping and WCF带有循环和 WCF 的 Windows 服务线程
【发布时间】:2012-03-22 19:25:58
【问题描述】:

首先,我将讨论一些遗留代码,我们会尽量避免对其进行更改。另外,我在 Windows 服务和 WCF 方面的经验有点有限,所以有些问题可能有点新手。只是为了在问题之前提供一些背景信息。

我们有一个现有的循环服务。它通过数据库调用检查是否有要处理的记录。如果没有找到任何记录,它会休眠 30 秒,然后重新唤醒以重试。

我想向该服务添加一个入口点,除了处理数据库中的记录外,它还允许我向该服务传递一条记录。所以基本流程是。

循环
* 从数据库中读取记录
* 如果数据库中没有记录,则处理通过入口点传入的所有记录。
* 完全没有记录,休眠 30 秒。

我担心的是这个。是否可以在一项服务中实现这一点,以便我有循环过程,但我也允许随时调用,并将其他项目添加到可以在循环中处理的队列中。我关心的是并发性以及防止循环和监听器相互踩踏。

我知道这个问题的措辞可能不太正确,但我正在处理这个问题。任何帮助将不胜感激。

【问题讨论】:

  • 什么样的“入口点” - 什么会发出这个入口点的信号,它是如何做到的?如果尽可能少地更改遗留代码很重要,您是否可以不将这个“事件”数据添加到数据库表中?顺便说一句,“事件”数据可以很容易地通过 TCP/管道发送到服务并排队到处理线程,该处理线程通常在队列上等待 30 秒超时。如果是我,我会很想添加一个存储过程/触发器,它会排队一个条目以立即告诉服务记录可用,但我想这已经结束了:(

标签: c# multithreading wcf windows-services


【解决方案1】:

我关心的是并发性以及防止循环和侦听器相互踩踏。

只要您正确同步访问,这应该不是问题。

最简单的选择可能是使用线程安全集合(例如ConcurrentQueue<T>)来保存要处理的项目。 WCF 服务可以轻松地将项目添加到集合中,您的下一个处理步骤将处理它。在这种情况下,同步实际上是最小的,因为队列已经是完全线程安全的。

【讨论】:

  • 感谢您的建议。今晚我将根据你的建议尝试一些压力测试,但这听起来像是我需要的。老实说,这是我担心的主要问题(如何安全地管理队列线程)。
  • @Bomlin 您可能还想看看 BlockingCollection - 将它与 GetConsumingEnumerable 一起使用可以使这样的事情变得简单,并且实际上可以完全消除 30 秒的睡眠,因为它只会在添加项目时进行处理无需计时器...
  • Reed,您对 ConcurrentQueue 的建议非常有效。我编写了一个循环服务并拥有监听器。然后我编写了一个客户端,它产生了 10 个单独的线程,每个线程都添加了大量的项目。我随机化了项目的排队以及在循环内处理它们需要多长时间。据我所知,10,000 个项目根本没有并发问题。作为上面的附加说明,我还应该提到这个过程将在几个月内被替换。这就是我做这种创可贴类型编码的原因。
【解决方案2】:

除了 Reed 的出色回答之外,您可能还希望将记录保存在 MSMQ queue 中,以防止您的服务在服务关闭、重新启动或崩溃时丢失记录。

【讨论】:

  • 感谢您的建议。我很想使用它,但由于我无法进入这里的原因,有人告诉我 MSMQ 不是一个选项。商业原因而非技术原因。
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多