Windows服务应用架构疑惑

Windows Service application architecture doubts

我需要创建一些 Windows 服务应用程序 (C#),它应该执行多个定期执行并相互绑定的任务,例如:

  1. Watch for folder changes.
  2. Send files to Web Services (Web API).
  3. Write Log and keep it in local DB.

所以我正在徘徊,如果我可以使用“快速而肮脏的”方法并使用 BackgroundWorker class 实现所有这些,或者我已经使用了更多Tasks y 等复杂的东西 (.NET Windows Service - Architectural Decisions)。或者事件有一些框架可以做到这一点。

任何关于该应用程序可能的现代和干净结构的建议都将很高兴听到。非常感谢!

我将使用 worker 来实现,如果您希望扩展或现代架构,请使用像 Azure 这样的云。通过使用 Azure,您可以使用 Azure 队列来实现它。一名工作人员将观察变化,然后将变化排队。另一个工作人员使用队列将文件发送到 Web Api。记录您可以作为另一个工作人员完成,也可以与同一个工作人员一起完成。

典型的做法是创建一个线程来处理信息。

public partial class Service1 : ServiceBase
{
    private Timer _timer;
    public Service1()
    {
        InitializeComponent();
        _timer = new Timer(OnDoStuff);
    }

    protected override void OnStart(string[] args)
    {
        _timer.Change(5000, Timeout.Infinite);
    }

    protected override void OnStop()
    {
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
    }

    protected void OnDoStuff(object state)
    {
        //do your things here.



        //activate the timer again.
        _timer.Change(5000, Timeout.Infinite);
    }
}

定时器只使用 Change 方法中的第一个参数意味着它应该每 5 秒只 运行 一次。通过使用该方法,如果第一次调用未在 5 秒内完成,我们将确保计时器不会再次并行启动。

另请注意,如果 OnDoStuff 中存在未处理的异常,应用程序将崩溃,因此请确保您使用的是 try/catch.

除此之外,使用 windows 服务似乎可以完成这项任务。

听起来您需要在专用服务器上使用它。所以我的第一个建议是使用TopShelf。它使现代 Windows 服务的组合变得如此简单可笑。

然后,为了执行您问题中的步骤,我将使用某种工作流模式。 Windows Workflow Foundation 似乎足够现代来满足这一点。 (就个人而言,我只是将 chain-of-responsibility 模式与 DI 容器一起用作我的 quick 和 "dirty")。

最后将其与启动工作流程的 event-driven 方法相结合,例如 FileSystemWatcher,您甚至不需要担心后台工作人员等。

因此,做出这些架构决策后,您的服务将很容易设置、运行、测试和安装 (TopShelf),并且您可以模块化地构建和单元测试您的服务(工作流模式)。