首页 > 解决方案 > 使用任务计划程序或 Windows 服务为长时间运行的进程计划的控制台应用程序

问题描述

我们有以下功能,我们不确定是作为使用 Windows 任务调度程序调度的控制台应用程序还是作为 Windows 服务运行更好:-

  1. 用户在 SharePoint 文档库中上传文件
  2. 服务(控制台应用程序或 Windows 服务)需要使用 SharePoint CSOM 代码读取文件 >> 使用 Rest API 将文件发送到第 3 方应用程序 >> 从第 3 方 API 获取数据并使用 CSOM 代码更新 SharePoint >>将相关文件移动到不同的 SharePoint 文档库

所以我们不确定我们是否应该将上述实现为使用任务调度程序调度的控制台应用程序还是作为 Windows 服务?

我们有以下事实:-

  1. 我们的托管服务器是托管在 AWS 内的 Windows VM。
  2. 我们不希望 2 次执行同时运行,这是为了防止 2 次执行在同一个文件上工作。
  3. 我们的代码必须在 C# 中。

那么任何人都可以建议我们是否应该使用任务计划程序或 Windows 服务计划的控制台应用程序,为什么?

谢谢

标签: .netwindows-servicesconsole-applicationwindows-task-scheduler

解决方案


如果您主要关心的是防止应用程序的一个实例(或线程)处理已被另一个实例(或另一个线程)处理的文件,那么您可以使用系统同步原语(请参阅互斥类)来实现这一点。(请务必使用 try/finally 块来释放互斥锁。)

WRT 控制台应用程序与 Windows 服务,选择实际上归结为样式和/或偏好(可能还有其他未知的要求)

控制台应用程序
  • 编码更简单
  • 可以使用 Mutex 来控制同步,也可以使用外部控制结构(db、log 等)
  • 但它必须依赖外部调度程序才能执行
  • 并且它可能需要依赖调度器来处理重新执行失败的作业
Windows 服务
  • 编码不太简单
  • 可以使用 Mutex 进行同步,也可以使用其他内部或外部控制结构
  • 它可以管理自己的日程安排
  • 并且对于实现复杂的失败作业处理逻辑可能更简单

PS Task Scheduler 的一个独特功能是它能够将系统从休眠/睡眠中唤醒以执行作业,尽管这对您的 AWS 托管 VM 环境不太感兴趣。


推荐阅读