我们在Windows上将C#控制台程序作为计划任务运行。这个程序本身运行了许多任务"当程序本身结束时,需要正常关闭。
有没有办法在计划任务结束时运行清理代码(可能需要一两秒钟)?例如,通过从PowerShell脚本调用Stop-ScheduledTask
来结束它。
我已尝试捕获CTRL-C事件以及捕获ProcessExit
AppDomain
事件,但在计划任务结束时似乎没有调用这些事件。
正如评论中 rrirower 所述,另一个选择是在要求终止之前向进程发送信号,但在Windows上似乎没有更好的支持。
答案 0 :(得分:0)
在我终止计划任务之前,我最终向程序的REST API发出HTTP查询,要求它终止其任务:
Invoke-RestMethod -Method Post -Uri ("{0}/Application/TerminateAllTasks" -f $programUrl)
$p = Get-Process "NameOfTheProcess" -ErrorAction Stop
$task | Stop-ScheduledTask -ErrorAction Stop
$p.WaitForExit()
从长远来看,我们会将程序转换为适当的Windows服务,这样可以更轻松地终止优雅。