2014-01-14 166 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後端,它完全符合你想要實現的目標,非常成功,多線程,它..

然而,我的僱主知識產權等方面的政策阻止我分享更多的辦法比:-(