【问题标题】:Windows Service application architecture doubtsWindows Service 应用架构疑惑
【发布时间】:2016-04-24 22:24:14
【问题描述】:

我需要创建一些 Windows Service App (C#),它们应该执行几个定期执行并相互绑定的任务,例如:

  1. 注意文件夹更改。
  2. 将文件发送到 Web 服务 (Web API)。
  3. 写入日志并将其保存在本地数据库中。

所以如果我可以使用“快速而肮脏的”方法并使用BackgroundWorker 类来实现所有这些,或者我使用更复杂的东西,例如Tasks y 等(@987654321 @)。或者事件有一些框架可以做到这一点。

很高兴听到有关该应用程序可能的现代和简洁结构的任何建议。非常感谢!

【问题讨论】:

    标签: .net architecture windows-services


    【解决方案1】:

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

    然后,为了执行您问题中的步骤,我将使用某种工作流模式。 Windows Workflow Foundation 似乎足够现代,可以满足这一点。 (就我个人而言,我只是使用带有 DI 容器的责任链模式作为我的快速和“脏”)。

    最后将其与启动工作流的事件驱动方法(如 FileSystemWatcher)相结合,您甚至无需担心后台工作人员等。

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

    【讨论】:

      【解决方案2】:

      我将使用 worker 来实现,如果您正在寻求扩展或现代架构,那么使用像 Azure 这样的云。通过使用 Azure,您可以使用 Azure 队列来实现它。一名工作人员将观察更改,然后将更改排入队列。另一个使用队列将文件发送到 Web Api 的工作人员。您可以作为其他工作人员完成日志记录,也可以与同一工作人员一起完成。

      【讨论】:

        【解决方案3】:

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

        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 服务似乎可以完成这项任务。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-11-02
          • 2018-05-28
          • 2018-02-05
          • 1970-01-01
          • 1970-01-01
          • 2017-02-16
          • 2013-09-06
          相关资源
          最近更新 更多