我需要创建一些 Windows服务应用程序(C#),它应该执行几个定期执行并绑定到彼此的任务,例如:
- 留意文件夹更改。
- 将文件发送到Web服务(Web API)。
- 写入日志并将其保存在本地数据库中。
醇>
所以,如果我能快速使用" ,那么我就会徘徊"使用BackgroundWorker
类来处理和实现所有这些,或者我使用了更复杂的东西,例如Tasks
y等(.NET Windows Service - Architectural Decisions)。或者事件有一些框架可以做到。
关于该应用程序可能的现代和清洁结构的任何建议都很高兴听到。非常感谢你!
答案 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),您可以模块化地构建和单元测试您的服务(工作流模式)。