Windows服务应用程序架构存疑

时间:2016-01-19 12:31:35

标签: .net architecture windows-services

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

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

所以,如果我能快速使用" ,那么我就会徘徊"使用BackgroundWorker类来处理和实现所有这些,或者我使用了更复杂的东西,例如Tasks y等(.NET Windows Service - Architectural Decisions)。或者事件有一些框架可以做到。

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

3 个答案:

答案 0 :(得分:1)

我将使用worker来实现,如果您正在寻求扩展或现代架构,那么使用Azure之类的云。通过使用Azure,您可以使用Azure队列来实现它。一名工人将观察变化,然后将变化排入队列。另一个使用队列将文件发送到Web Api的工作者。记录您可以作为另一个工作人员完成,也可以使用同一个工作人员完成。

答案 1 :(得分:1)

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

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服务似乎很适合这项任务。

答案 2 :(得分:1)

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

然后,为了执行问题中的步骤,我会使用某种工作流程模式。 Windows Workflow Foundation似乎很现代,足以满足这一需求。 (就个人而言,我只是使用责任链模式和DI容器作为我的快速和"脏" )。

最后将其与启动工作流程的事件驱动方法相结合,例如FileSystemWatcher,您甚至不必担心背景工作者等。

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

相关问题