【问题标题】:Console application scheduled using task scheduler or Windows service fro long running processes使用任务计划程序或 Windows 服务从长时间运行的进程中计划的控制台应用程序
【发布时间】:2021-10-18 21:33:37
【问题描述】:
我们有以下功能,我们不确定是作为使用 Windows 任务调度程序调度的控制台应用程序还是作为 Windows 服务运行更好:-
- 用户在 SharePoint 文档库中上传文件
- 服务(控制台应用程序或 Windows 服务)需要使用 SharePoint CSOM 代码读取文件 >> 使用 Rest API 将文件发送到第 3 方应用程序 >> 从第 3 方 API 获取数据并使用 CSOM 更新 SharePoint代码 >> 将相关文件移动到不同的 SharePoint 文档库
所以我们不确定是否应该将上述实现作为使用任务调度程序调度的控制台应用程序还是作为 Windows 服务?
我们有以下事实:-
- 我们的托管服务器是托管在 AWS 中的 Windows VM。
- 我们不希望同时运行 2 个执行,这是为了防止 2 个执行处理相同的文件。
- 我们的代码必须是 C#。
那么任何人都可以建议我们是否应该使用使用任务计划程序或 Windows 服务计划的控制台应用程序,为什么?
谢谢
【问题讨论】:
标签:
.net
windows-services
console-application
windows-task-scheduler
【解决方案1】:
如果您主要关心的是阻止应用程序的一个实例(或线程)处理已被另一个实例(或另一个线程)处理的文件,那么您可以使用系统同步原语(请参阅Mutex Class)来实现这一点。 (请务必使用 try/finally 块来释放 Mutex。)
WRT 控制台应用程序与 Windows 服务,选择实际上归结为样式和/或偏好(可能还有其他未知的要求)
控制台应用
- 编码更简单
- 可以使用 Mutex 来控制同步,也可以使用外部控制结构(db、log 等)
- 但它必须依赖外部调度程序才能执行
- 它可能需要依赖调度程序来处理重新执行失败的作业
一个Windows服务
- 编码不那么简单
- 可以使用 Mutex 进行同步,也可以使用其他内部或外部控制结构
- 它可以管理自己的日程安排
- 并且对于实现复杂的失败作业处理逻辑可能更简单
附:任务计划程序的一个独特功能是它能够将系统从休眠/睡眠状态唤醒以执行作业,尽管这在您的 AWS 托管 VM 环境中不太可能引起人们的兴趣。