2014-01-14 117 views
2

我知道这个话题的变化已经被问过,但这里是我的情况:Windows任务调度VS Windows服务.NET应用程序

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

对于我最初的开发,我写了一个C#类库它可以完成所有的FTP工作。此应用程序(可能是一个控制台应用程序或Windows服务)将最有可能运行在Windows Server 2012上运行

现在到下一块,我试图决定之间:

1)写控制台应用程序(或PowerShell脚本?),它将命令 行输入加上每个接口的配置文件。我会 使用Windows任务计划程序进行计划。为了部署这些接口,我可以创建一个使用“schtasks.exe” 创建和配置任务的批处理文件。每个界面的一项任务。听起来 易peasy ...

OR

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

如果我是作为一项服务完成的,我该如何管理 的维护/部署?如果我停止服务,它会不会影响所有接口 ?我该如何执行实际的 调度?我读过的建议是使用Quartz.Net调度程序或者.Net定时器。

- - -

一些额外的想法: 以下是在计算器上的一些读物,它会弹出这些议题/关注:

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

任务计划参与讨论

  • 列表项目
  • 可能需要登录? (我读过这是不正确的)机器管理员密码更改
  • 问题(我读过这是不正确的)
  • 问题与高权威帐户(网络服务,本地系统或用户)
  • 运行
  • 多个进程/长时间运行事务的问题 这对我来说真的很糟糕,例如,如果两个进程试图下载(并删除)相同的源FTP文件。许多
  • 经验是,这是不是稳定/可靠的Windows服务,特别是在早期的操作系统Windows7的前
  • 较少的基础设施支持(如重试,监控等故障策略)
  • 关注时调度在数秒内

的Windows服务问题

  • 列表项
  • 潜在的国际空间站与计时器的UE
  • 更复杂

控制台应用程序+任务计划参与讨论

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

期待一些反馈和示例代码/脚本,如果相关也高度赞赏。

感谢

+0

_full真正world_样品(C#库FTP)具有良好的'模式和使用practices' ***任务调度程序,Windows服务或石英***? –

回答

2

您可以访问使用 无论add-type[System.Reflection.Assembly]在PowerShell中的C#类 - 看看这个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.ps1,Weekly_Expenses_xfer.ps1与逻辑相关的转移,电子邮件提醒成功/失败等

唯一不解决的问题是相同的文件/目的地正在同一时间处理,但你可能有单独的脚本检查在开始时如果他们已经在运行 - 请参阅接受的答案 - Assure only 1 instance of PowerShell Script is Running at any given Time

对于Windows提示,您可以以未登录的用户身份运行计划任务,并且您不会看到PowerShell命令窗口,因为它们将在不同的控制台上 - 确保不要设置PowerShell.exe的开关-noexit,以便它们在完成时消失。

曾在对于只运行作为GUI,不作为服务工具的​​工作要做到这一点,并不能与srvany等地frigged - 我们的设置运行(启动)计划任务的服务帐户和运行一个运行GUI的powershell脚本。exe

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

这是一个混乱,但它的作品。

道歉我没有给出太多代码示例的方式,在我的手机上这样做,但可能会给你的想法。

你也可以在c#中完成所有工作 - 我们有一个内部开发的应用程序,它带有SQL后端,它完全符合你想要实现的目标,非常成功,多线程,它..

然而,我的雇主知识产权等方面的政策阻止我分享更多的办法比:-(