Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Windows服务应用程序体系结构_.net_Architecture_Windows Services - Fatal编程技术网

.net Windows服务应用程序体系结构

.net Windows服务应用程序体系结构,.net,architecture,windows-services,.net,Architecture,Windows Services,我需要创建一些Windows服务应用程序(C#),这些应用程序应该执行一些定期执行并相互绑定的任务,例如: 注意文件夹更改 将文件发送到Web服务(Web API) 写日志并保存在本地数据库中 所以我想知道我是否可以使用“快速而肮脏”的方法,并使用BackgroundWorker类实现所有这些,或者我是否使用了更复杂的东西,比如任务y等等()。或者有一些框架可以做到这一点 任何关于该应用程序可能的现代而干净的结构的建议都会很好。多谢各位 我将使用worker来实现,如果您希望实现规模化或现代架构

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

  • 注意文件夹更改
  • 将文件发送到Web服务(Web API)
  • 写日志并保存在本地数据库中
  • 所以我想知道我是否可以使用“快速而肮脏”的方法,并使用
    BackgroundWorker
    类实现所有这些,或者我是否使用了更复杂的东西,比如
    任务
    y等等()。或者有一些框架可以做到这一点


    任何关于该应用程序可能的现代而干净的结构的建议都会很好。多谢各位

    我将使用worker来实现,如果您希望实现规模化或现代架构,那么请使用类似Azure的云。通过使用Azure,您可以通过使用Azure队列来实现it。一名工作人员将观察更改,然后将更改排队。另一个用于使用队列将文件发送到web Api的工作程序。日志记录您可以作为另一个worker完成,也可以使用同一个worker完成。

    我将使用worker进行实现,如果您希望扩展或采用现代体系结构,那么请使用类似于Azure的云。通过使用Azure,您可以通过使用Azure队列来实现it。一名工作人员将观察更改,然后将更改排队。另一个用于使用队列将文件发送到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服务似乎可以完成此任务。

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

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

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

    然后,为了执行问题中的步骤,我将使用某种工作流模式。看起来很现代,足以满足这一需求。(就我个人而言,我只是使用责任链模式和DI容器作为我的快捷和“肮脏”)

    最后,将其与启动工作流的事件驱动方法相结合,例如,您甚至不需要担心后台工作人员等


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

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

    然后,为了执行问题中的步骤,我将使用某种工作流模式。看起来很现代,足以满足这一需求。(就我个人而言,我只是使用责任链模式和DI容器作为我的快捷和“肮脏”)

    最后,将其与启动工作流的事件驱动方法相结合,例如,您甚至不需要担心后台工作人员等

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