2016-11-22 3 views
0

Мы запускаем консольную программу C# в качестве запланированной задачи в Windows. Эта программа сама запускает множество «задач», которые должны быть изящно завершены, когда сама программа закончится.Как запустить код при завершении запланированной задачи

Есть ли способ запустить код очистки (который может занять секунду или два), когда запланированная задача завершена? Например, когда он заканчивается вызовом Stop-ScheduledTask из сценария PowerShell.

Я попытался поймать события CTRL-C, а также поймать событие ProcessExitAppDomain, но ни один из них не вызывается, когда запланированная задача завершена.

Как указано в комментариях, другой вопрос будет заключаться в том, чтобы отправить сигнал процессу, прежде чем просить его прекратить работу, но это не похоже на поддержку 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, которая облегчит изящное завершение.