Design patterns Windows服务与设计模式

Design patterns Windows服务与设计模式,design-patterns,windows-services,Design Patterns,Windows Services,我有一个windows服务来做后台处理。此windows服务将与asp.net网站交互。功能如下所示 在我的网站上有3个动作。用户可以选择任务(假设有三个按钮)。然后它将调用windows服务。其余操作由windows服务执行。用户可以从该网站注销,但它将在后台运行该服务。一旦完成,它将在数据库中进行相应的更改。 我需要知道是否可以将任何设计模式应用于windows服务(工厂、抽象工厂等)。我读过关于不同设计模式的书,但我真的很困惑这是如何应用到项目中的。目前,我正在windows服务的“OnS

我有一个windows服务来做后台处理。此windows服务将与asp.net网站交互。功能如下所示

在我的网站上有3个动作。用户可以选择任务(假设有三个按钮)。然后它将调用windows服务。其余操作由windows服务执行。用户可以从该网站注销,但它将在后台运行该服务。一旦完成,它将在数据库中进行相应的更改。 我需要知道是否可以将任何设计模式应用于windows服务(工厂、抽象工厂等)。我读过关于不同设计模式的书,但我真的很困惑这是如何应用到项目中的。目前,我正在windows服务的“OnStart”和“OnStop”事件中编写整个代码。请引导我


谢谢。

我唯一一次安装多个服务实例是针对多个环境,如开发、测试和生产环境。否则,它应该保持在同一个服务中,假设所有代码在逻辑上都是相关的

至于设计模式,对于我创建的大多数服务,我都遵循一个简单的“模式”。我鼓励回答,因为我自己不知道这是否是一个好的模式。它基本上包括创建一个立即启动的主线程,以及基于需要执行的操作的子线程。对于您的情况,下面可能是用户处理器的简单服务布局

服务类别:

public partial class Service : ServiceBase
{
    private Processor _processor;

    public Service() { InitializeComponent(); }

    protected override void OnStart(string[] args)
    {
        _processor = new Processor();
        new System.Threading.Thread(_processor.Run).Start();
    }

    protected override void OnStop()
    {
        _processor.Stop();
    }
}
处理器:

public class Processor
{        
    private bool _continue;
    private List<UserProcessor> _userProcessors; // List of users being processed.

    public void Run()
    {
        _continue = true;
        while (_continue)
        {
            var users = getUsersToProcess();
            foreach (User user in users)
            {
                if (_userProcessors.Any(u => u.UserId == user.UserId) == false)
                {
                    // Start a new processor for the user since it wasn't found.
                    var processor = new UserProcessor(user);
                    new System.Threading.Thread(processor.Run).Start();
                    _userProcessors.Add(processor);
                }
            }

            System.Threading.Thread.Sleep(1000);
        }
    }

    public void Stop()
    {
        _continue = false;

        foreach (var processer in _userProcessors)
            processer.Stop();
    }

    private List<User> getUsersToProcess() { throw new NotImplementedException(); }
}
公共类处理器
{        
私人住宅继续;
私有列表_userProcessors;//正在处理的用户列表。
公开募捐
{
_继续=真;
while(_continue)
{
var users=getUsersToProcess();
foreach(用户中的用户)
{
if(_userProcessors.Any(u=>u.UserId==user.UserId)==false)
{
//为用户启动新处理器,因为找不到它。
var处理器=新用户处理器(用户);
新的System.Threading.Thread(processor.Run.Start();
_添加(处理器);
}
}
系统线程线程睡眠(1000);
}
}
公共停车场()
{
_continue=false;
foreach(用户处理器中的变量处理器)
processer.Stop();
}
私有列表GetUserStopProcess(){抛出新的NotImplementedException();}
}

当然,UserProcessor的设置几乎与Processor相同,但while循环中的代码不同。这是您进行数据库交互的地方,但我会让您了解这一部分。

您至少需要从在OnStart方法中创建一些正在运行的线程开始。理想情况下,OnStart方法需要立即完成。否则,当您启动服务时,它将挂起“Starting”消息,直到超时。听起来您可能想了解一些基本的服务教程,并发布您遇到的特定问题。是计时器的基本用法。非常感谢您的回复。这真的很有用。目前,我正在创建多个服务实例来处理登录网站的多个用户。现在我认为,我可以为另一个用户的请求创建一个新线程,而不是创建多个服务实例。rt?(一个服务和多个线程),我还可以限制要创建的新线程的数量。这是正确的方法吗?那么设计模式呢?我的服务逻辑包含一些db操作和一些带有只读数组的静态类。设计模式是否有特定的角色?我对它的用法有点困惑。-->谢谢。@Dev,如果您有一个工作示例需要评论,您也可以签出。@making3,您是否错过了在调用开始运行任务后将UserProcessor添加到_userProcessors集合的代码?@samneric,您是对的,很好。它可以编译,但是Stop()在那一点上不能正常工作,因为不会填充_userProcessors。另外,我开始使用代码-谢谢我刚从Threading.Thread.Start切换到Task.Start,用于当代方面:)