2016-11-22 115 views
0

我們正在Windows上運行C#控制檯程序作爲計劃任務。這個程序本身運行了很多「任務」,當程序本身結束時,這些「任務」需要被正常關閉。如何在計劃任務終止時運行代碼

當計劃任務結束時,是否有辦法運行清理代碼(可能需要一兩秒鐘)?例如,當它通過PowerShell腳本調用Stop-ScheduledTask來結束時。

我試過捕獲CTRL-C事件以及捕獲ProcessExit事件AppDomain,但是當計劃的任務結束時,這些事件都不會被調用。

正如rrrrower在註釋中所述,另一個選擇是在發送信號給進程,然後要求它終止,但在Windows上似乎沒有更好的支持。

+2

腳本無法運行清理代碼的任何原因? – rrirower

+0

如果有辦法向進程發送一個信號,這是我正在研究的另一個選項(不知道如何在Windows上乾淨地做到這一點,儘管'taskkill'似乎是一種方式)。 –

+0

@Damith不知道觸發器是如何幫助這裏的...... –

回答

0

我最終作出一個HTTP查詢到該程序的REST API來要求它停止其工作,之前,我終止計劃任務:

Invoke-RestMethod -Method Post -Uri ("{0}/Application/TerminateAllTasks" -f $programUrl) 
$p = Get-Process "NameOfTheProcess" -ErrorAction Stop 
$task | Stop-ScheduledTask -ErrorAction Stop 
$p.WaitForExit() 

從長遠來看,我們將轉換程序到適當的Windows服務,這將使優雅的終止更容易。