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

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

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

在“任务计划程序”窗口的Run Result ”列的Run Result Task Status部分中,即使应用程序抛出内部exception,我也始终获得“ Success

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

如何才能做到这一点?

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

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

我在测试中validation过

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

如果查看计划任务的历史记录,则应该看到两个事件,“操作已完成”,然后是“任务已完成”。 如果您检查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 

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

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

 Environment.Exit(someNumber) 

Environment.Exit

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