c# - Windows服务设计

标签 c# .net design-patterns windows-services

想象一下下面的情况。 Windows 服务不时检查数据库表中的数据。当出现一些新数据时,它会开始处理每一行。

处理由几个逻辑阶段组成,假设是:

  • 从网络服务中获取一些额外的数据;
  • 根据第 1 阶段的数据通过 Web 服务查找现有对象或创建新对象;
  • 将已完成的操作告知感兴趣的人(关于在第 2 阶段找到/创建的对象的详细信息);
  • 做其他事情。

就目前而言,如果发生任何异常,服务会更新数据库行并设置一个标志以指示发生了错误。一段时间后,服务将尝试再次处理该行...这就是问题所在。

处理将从一开始就开始,从第 1 阶段开始。在这种情况下,如果异常发生在第 4 阶段,并且它会一次又一次地发生,来自第 3 阶段的感兴趣的人将被一次又一次地通知......

在出现异常时完全停止行处理是不可能的,在我的情况下也是不可取的。理想情况下,如果有一种方法可以从上次失败的阶段开始处理,那就太好了。

现在我需要你的建议如何处理所有这些。事实上,一切都更加复杂,因为有多种处理模式,不同的阶段数等等。

提前致谢。

更新

是的,我在数据行中有 State 参数 :) 只是暂时不用。异常处理对我来说并不是什么新鲜事。

问题是:处理状态切换的最佳方式是什么?换句话说,在阶段编号和处理方法之间建立明确的逻辑联系?执行流程可能非常不同,包括不同数量的阶段和不同行的方法。

我希望,有比为每个新情况编写无休止的 switch/case block 更令人愉快的方法吗?

最佳答案

有几种模式可以帮助解决您描述中的每个问题。

  1. Windows 服务检查队列。在您的服务中设置一个每 1 分钟或 5 分钟或其他时间运行一次的计时器,检查队列,如果有任何新条目,则开始处理。 (参见此处示例:Best Timer for using in a Windows service)
  2. 遵循一系列步骤通常称为工作流程。在工作流中,您有一个当前状态,您可以在每个阶段更新该状态。所以每一行都将从 stage = 1 开始。在第一步之后,stage = 2,等等。在异常(exception)情况下,它将在它停止的阶段,然后将在该阶段重新开始该过程,或者任何你逻辑是。该状态将存储在每一行中,调度代码将检查状态并将服务发送到当前阶段的正确起始代码。即,考虑一组基于状态的 If 语句。
  3. 处理异常非常简单。每个工作单元都应该包含在一个 try...catch block 中。出错时,记录异常,并根据您的业务规则标记该行。

就实现而言,使用编程最佳实践来保持代码干净、模块化、整洁和有条理。在开发解决方案时,请将具体问题带回来以获得更多帮助。

关于c# - Windows服务设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852149/

相关文章:

c# - ElasticSearch NEST searchresponse.hits 数据未填充

c# - 多个串行端口读取仅在几分钟后挂起

c# - System.Xml.XmlException : Invalid character in the given encoding

c# - .NET 中的命令模式与事件语法

c# - 如何在 C# 中的多命令模式中与不同线程共享相同的上下文?

c++ - 内存管理的思路,std::map,boost::shared_ptr

c# - VSTests - 找不到诊断数据适配器 'Code Coverage'

c# - 如何从已知方法中获取方法名?

c# - 为什么在 C# 中我们需要初始化原始类型变量?

.net - 为 azure 函数设置日志记录的最简单方法是什么?