Windows任务计划程序与Windows服务的.Net应用程序

时间:2014-01-14 21:06:34

标签: c# powershell ftp windows-services windows-scheduler

我知道已经有人问过这个主题的变化,但这是我的情况:

我有大约30个FTP接口应用程序。每个接口都有自己的要求和配置,但基本上它从源服务器下载文件 - 有时是每天,有时是每分钟(有些,甚至可能在几秒钟内安排)

对于我的初步开发,我编写了一个C#类库来完成所有FTP工作。此应用程序(无论是控制台应用程序还是Windows服务)很可能在Windows Server 2012下运行。

现在是下一篇文章,我正在尝试决定:

  

1)编写一个带命令的控制台应用程序(或powershell脚本?)   行输入加上每个接口的配置文件。我会   使用Windows任务计划程序安排此操作。用于部署这些   接口,我可以创建一个使用“schtasks.exe”的批处理文件   创建和配置任务。每个接口的一项任务。声音   容易腻子......

OR

  

2)编写一个Windows服务应用程序......但是在这里,我很困惑。我   为我的每个接口创建和安装服务? (即仅   不同的东西可能是配置文件)。或者,我创建一个主要   为单个中定义的每个接口生成线程的服务   配置文件?

     

如果我将此作为单项服务,我该如何管理   维护/部署这个?如果我停止服务,不会   影响所有接口?我如何执行实际操作   调度?我读过的建议是使用Quartz.Net调度程序或   只是.Net计时器。

- - -

一些额外的想法: 以下是StackOverflow的一些读物,它们提出了这些主题/关注点:

windows service vs scheduled task Scheduled console app vs Windows service? When is it appropriate to use each

任务计划程序问题

  • 列表项
  • 可能需要登录吗? (我读过这不是真的)
  • 关于机器管理员密码更改的问题(我读过这不是真的)
  • 在高权限帐户(NetworkService,LocalSystem或用户)中运行的问题
  • 多个进程/长时间运行的事务的问题 这对我来说真的很糟糕,例如,如果两个进程试图下载(和删除)相同的源FTP文件。
  • 许多人的经验是,这不像Windows服务那样稳定/可靠,特别是在Windows7之前的早期操作系统上
  • 减少基础架构支持(例如重试,监控等的失败政策)
  • 在几秒钟内安排时的担忧......

Windows服务问题

  • 列表项
  • 计时器的潜在问题
  • 更复杂

控制台应用+计划任务问题

  • 列表项
  • 无法在后台运行 - 因此托管服务器将启动命令提示符 这是一个严重的问题。如果我有30个FTP接口,并且每个接口都计划每分钟/小时运行,那就是很多窗口!!!
  • 我如何解决这个问题?请改用PowerShell脚本吗?

期待一些反馈,并提供示例代码/脚本,如果相关,也非常感谢。

由于

1 个答案:

答案 0 :(得分:2)

您可以使用PowerShell访问您的c#类 add-type[System.Reflection.Assembly] - 请查看此SO帖子以获取示例 - Can I access My Custom .NET Class from PowerShell?

你可以在powershell中使用start-job等来完成所有操作,但是你的控制脚本需要付出很多努力。

我很想使用Powershell内置(在版本3中)cmdlet来创建/修改任务调度程序和自定义触发器中的预定作业 - http://blogs.technet.com/b/heyscriptingguy/archive/2012/09/18/create-a-powershell-scheduled-job.aspx

让它安排正在运行.ps1 powershell脚本的作业,每个转移一个或相关转移组例如Monthly_Payroll_xfer.ps1Weekly_Expenses_xfer.ps1具有与该转移相关的逻辑,电子邮件成功/失败警报等。

唯一没有解决的是同时处理相同的文件/目标但是如果它们已经在运行,您可以在开始时检查单个脚本 - 请参阅此帖子的接受答案 - {{3 }}

对于Windows提示,您可以作为不会登录的用户运行计划任务,并且您将看不到powershell命令窗口,因为它们将位于不同的控制台上 - 请确保不要设置{ {1}}切换powershell.exe,以便在完成后消失。

必须在工作中为一个仅作为GUI运行的工具,而不是作为服务运行,并且不能用-noexit等运行 - 我们设置一个运行(启动时)的计划任务服务帐户并运行运行GUI.exe的PowerShell脚本

然后我们使用powershell脚本来srvany来杀死它,禁用/启用任务(比如禁用/启用服务)和一个来运行任务。

这是一个淤泥,但它确实有效。

道歉我没有在代码示例方面给出太多帮助,在我的手机上做了这个,但可能会给你一些想法。

你也可以在c#中完成所有这一切 - 我们有一个内部开发的应用程序,带有SQL后端,它完全符合你想要实现的目标,非常成功,多线程,非常大量的数据被清除掉..

但是,我的雇主的知识产权和其他政策阻止我分享更多关于它的信息: - (