【问题标题】:Which option for building this polling windows service is better?构建此轮询窗口服务的哪个选项更好?
【发布时间】:2026-02-21 11:55:02
【问题描述】:

我的团队正在编写一个 Windows 服务,该服务需要轮询来自第 3 方系统的数据(第 3 方系统提供了我们使用的 Web 服务)。
该过程将如下所示:
1.呼叫第3方WS
2. 将收到的原始数据保存到我们的数据库
3. 处理原始数据
4. 将处理后的数据保存到我们的数据库
5. 重复

团队同意我们实际上有 2 种不同的逻辑操作:
1. 获取和保存原始数据
2. 处理原始数据并保存结果

我们正在尝试确定以下哪种设计方案更好:
选项 1:在同一个 Windows 服务上执行两个操作,每个操作在它自己的线程上执行
方案二:对windows服务执行第一个操作,第二个操作async/one-way调用wcf服务

您认为哪个选项更好?
如果您有其他您认为更好的选择,请分享。

谢谢。

【问题讨论】:

    标签: c# .net wcf service polling


    【解决方案1】:

    这取决于。

    鉴于您有一个明显的顺序进程,为什么要使用单独的线程来读取然后处理数据?最简单的方法是使用单个线程循环读取、处理它,并可能在某个时间点等待,这样您就不会受到第三方的速率限制。

    但是,如果处理需要很长时间,您可能希望将工作分配给单个轮询线程和一组处理数据的工作线程。

    最简单的选项通常最适合您的初始实施。在需要之前添加线程和 WCF 服务调用很少是正确的做法。

    要给出更好的答案,您确实需要提供更多信息:第三方服务是否限制您一次可以拨打多少电话或拨打电话的速度、处理需要多长时间、您需要多长时间投票,...

    【讨论】:

    • 第三方服务位于遗留系统之上,不支持同时进行多次调用。此外,它最多只能在单个响应中发送 1000 个实体。我们想要分离进程,因为我们的处理可能非常慢,因为它包含几个空间查询(主要是交叉点)和一个针对非常大的表(大约 3M 行)的查询。此外,我们需要每秒轮询一次,我们的用户需要处理后的数据,一旦可用。
    【解决方案2】:

    根据您的评论,我会说您有一个线程每秒轮询一次 3rd 方服务并启动两个任务。

    任务 1 将原始数据存储到数据库。 任务 2 将处理原始数据并将结果存储在数据库中。

    如果轮询线程检索到 1000 个条目,它应该立即再次轮询。

    您可以使用 System.Threading.ThreadPool 或 System.Threading.Tasks.Task。

    【讨论】: