我的应用程序失败时如何通知Windows任务计划程序?

Ale*_*rez 15 c# wpf scheduled-tasks

我在任务计划程序中安排了WPF应用程序.

我想在应用程序失败时通知Task Scheduler.

在任务计划程序窗口Task Status的列中的部分中,即使应用程序抛出内部异常Run Result,我也总能得到Success.

Application.Current.Shutdown(1)试图通知任务计划程序失败,但我没有成功.

如何才能做到这一点?

hat*_*ica 17

问题出在Task Scheduler的设计中.正如这里指出的:

Win7中的Windows任务计划程序如何识别失败的任务?

我在测试中验证过

任务完成时,Windows任务计划程序不会检查退出代码或任何其他值.您必须处理自己的脚本或程序中的任何错误处理.

如果查看计划任务的历史记录,则应该看到两个事件,"操作已完成",然后是"任务已完成".如果检查Action Completed,它应该如下所示:

任务计划程序成功完成任务"\ test4",实例"{a41adae0-a378-45f6-aadc-648d27852042}",操作"C:\ blah..blah\Release\WpfApplication1.exe",返回码为55.

如您所见,应用程序退出并返回代码,但Task Scheduler仍然表示成功.我看到的唯一解决方案是通过右键单击历史记录条目并选择"将任务附加到此事件..."来自行处理.

或者,您可以从批处理文件运行应用程序,并让批处理文件检查退出代码,并采取相应措施.然后,您将使用任务计划程序来计划批处理文件,而不是直接安排WPF应用程序.

关于从WPF应用程序返回退出代码,您可能需要在Visual Studio中右键单击项目属性,然后在"应用程序"选项卡中,选择"输出类型的控制台应用程序".此外,使用任务计划程序中的发布版本而不是调试版本来确保使用应用程序的退出代码,而不是使用添加的调试内容生成的内容.您可以通过将此小批处理文件与exe文件放在同一文件夹中并运行它(替换应用程序的exe文件名)来测试您的应用程序是否正确生成退出代码:

wpfapplication1.exe
echo %errorlevel%
pause
Run Code Online (Sandbox Code Playgroud)

您的原始代码可能会成功设置退出代码,但Shutdown是一个更温和的退出,并且可能不会立即退出(或根本不退出),因为它将等待线程等正常退出.Environment.Exit将更有力地退出.

要使用Environment.Exit,您应指定默认值0以外的退出代码(这意味着成功).你可以使用

Environment.Exit(someNumber)
Run Code Online (Sandbox Code Playgroud)

Environment.Exit

您需要有一个全局异常处理程序来执行此操作以防止未捕获的异常.此博客文章提供了更多详细信息:http://jrich523.wordpress.com/tag/task-scheduler/

  • 我不明白为什么Windows Task Scheduler不会尊重正在运行的程序的返回值! (11认同)
  • 这个答案不清楚 - 解决方案是编辑的一半.谢谢你的努力; 多么令人沮丧的问题! (2认同)