.net - 使用任务计划程序或 Windows 服务为长时间运行的进程计划的控制台应用程序
问题描述
我们有以下功能,我们不确定是作为使用 Windows 任务调度程序调度的控制台应用程序还是作为 Windows 服务运行更好:-
- 用户在 SharePoint 文档库中上传文件
- 服务(控制台应用程序或 Windows 服务)需要使用 SharePoint CSOM 代码读取文件 >> 使用 Rest API 将文件发送到第 3 方应用程序 >> 从第 3 方 API 获取数据并使用 CSOM 代码更新 SharePoint >>将相关文件移动到不同的 SharePoint 文档库
所以我们不确定我们是否应该将上述实现为使用任务调度程序调度的控制台应用程序还是作为 Windows 服务?
我们有以下事实:-
- 我们的托管服务器是托管在 AWS 内的 Windows VM。
- 我们不希望 2 次执行同时运行,这是为了防止 2 次执行在同一个文件上工作。
- 我们的代码必须在 C# 中。
那么任何人都可以建议我们是否应该使用任务计划程序或 Windows 服务计划的控制台应用程序,为什么?
谢谢
解决方案
如果您主要关心的是防止应用程序的一个实例(或线程)处理已被另一个实例(或另一个线程)处理的文件,那么您可以使用系统同步原语(请参阅互斥类)来实现这一点。(请务必使用 try/finally 块来释放互斥锁。)
WRT 控制台应用程序与 Windows 服务,选择实际上归结为样式和/或偏好(可能还有其他未知的要求)
控制台应用程序
- 编码更简单
- 可以使用 Mutex 来控制同步,也可以使用外部控制结构(db、log 等)
- 但它必须依赖外部调度程序才能执行
- 并且它可能需要依赖调度器来处理重新执行失败的作业
Windows 服务
- 编码不太简单
- 可以使用 Mutex 进行同步,也可以使用其他内部或外部控制结构
- 它可以管理自己的日程安排
- 并且对于实现复杂的失败作业处理逻辑可能更简单
PS Task Scheduler 的一个独特功能是它能够将系统从休眠/睡眠中唤醒以执行作业,尽管这对您的 AWS 托管 VM 环境不太感兴趣。
推荐阅读
- c# - foreach 语句不能对“客户”类型的变量进行操作,因为没有“GetEnumerator”的公共实例定义
- jakarta-ee - 托管 Bean 隐式路由不起作用?
- tensorflow - 为什么 Keras 层的方法调用中的批量大小为 None?
- python - 如何将多个数据框行一键合并为一?
- python-3.x - Pyinstaller无法制作exe
- python - Python Api C 产生内存泄漏
- ccache - 检查 ccache 调用是否是缓存命中
- spring - Spring/Swagger 下载 docx 文件生成损坏的文档
- css - 浏览器是否优化了屏幕外无限循环的 CSS 动画?
- aws-lambda - 为什么我不能在 aws_lambda_alias routing_config 中使用 aws_lambda_function 数据源?