Windows服务应用架构疑惑
Windows Service application architecture doubts
我需要创建一些 Windows 服务应用程序 (C#),它应该执行多个定期执行并相互绑定的任务,例如:
- Watch for folder changes.
- Send files to Web Services (Web API).
- Write Log and keep it in local DB.
所以我正在徘徊,如果我可以使用“快速而肮脏的”方法并使用 BackgroundWorker
class 实现所有这些,或者我已经使用了更多Tasks
y 等复杂的东西 (.NET Windows Service - Architectural Decisions)。或者事件有一些框架可以做到这一点。
任何关于该应用程序可能的现代和干净结构的建议都将很高兴听到。非常感谢!
我将使用 worker 来实现,如果您希望扩展或现代架构,请使用像 Azure 这样的云。通过使用 Azure,您可以使用 Azure 队列来实现它。一名工作人员将观察变化,然后将变化排队。另一个工作人员使用队列将文件发送到 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 服务似乎可以完成这项任务。
听起来您需要在专用服务器上使用它。所以我的第一个建议是使用TopShelf。它使现代 Windows 服务的组合变得如此简单可笑。
然后,为了执行您问题中的步骤,我将使用某种工作流模式。 Windows Workflow Foundation 似乎足够现代来满足这一点。 (就个人而言,我只是将 chain-of-responsibility 模式与 DI 容器一起用作我的 quick 和 "dirty")。
最后将其与启动工作流程的 event-driven 方法相结合,例如 FileSystemWatcher
,您甚至不需要担心后台工作人员等。
因此,做出这些架构决策后,您的服务将很容易设置、运行、测试和安装 (TopShelf),并且您可以模块化地构建和单元测试您的服务(工作流模式)。
我需要创建一些 Windows 服务应用程序 (C#),它应该执行多个定期执行并相互绑定的任务,例如:
- Watch for folder changes.
- Send files to Web Services (Web API).
- Write Log and keep it in local DB.
所以我正在徘徊,如果我可以使用“快速而肮脏的”方法并使用 BackgroundWorker
class 实现所有这些,或者我已经使用了更多Tasks
y 等复杂的东西 (.NET Windows Service - Architectural Decisions)。或者事件有一些框架可以做到这一点。
任何关于该应用程序可能的现代和干净结构的建议都将很高兴听到。非常感谢!
我将使用 worker 来实现,如果您希望扩展或现代架构,请使用像 Azure 这样的云。通过使用 Azure,您可以使用 Azure 队列来实现它。一名工作人员将观察变化,然后将变化排队。另一个工作人员使用队列将文件发送到 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 服务似乎可以完成这项任务。
听起来您需要在专用服务器上使用它。所以我的第一个建议是使用TopShelf。它使现代 Windows 服务的组合变得如此简单可笑。
然后,为了执行您问题中的步骤,我将使用某种工作流模式。 Windows Workflow Foundation 似乎足够现代来满足这一点。 (就个人而言,我只是将 chain-of-responsibility 模式与 DI 容器一起用作我的 quick 和 "dirty")。
最后将其与启动工作流程的 event-driven 方法相结合,例如 FileSystemWatcher
,您甚至不需要担心后台工作人员等。
因此,做出这些架构决策后,您的服务将很容易设置、运行、测试和安装 (TopShelf),并且您可以模块化地构建和单元测试您的服务(工作流模式)。