【问题标题】:Windows Service application architecture doubtsWindows Service 应用架构疑惑
【发布时间】:2016-04-24 22:24:14
【问题描述】:
我需要创建一些 Windows Service App (C#),它们应该执行几个定期执行并相互绑定的任务,例如:
- 注意文件夹更改。
- 将文件发送到 Web 服务 (Web API)。
- 写入日志并将其保存在本地数据库中。
所以如果我可以使用“快速而肮脏的”方法并使用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 服务似乎可以完成这项任务。