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

时间:2013-06-06 18:28:46

标签: c# wpf scheduled-tasks

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

我想在应用程序失败时通知任务计划程序。

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

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

如何做到这一点?

2 个答案:

答案 0 :(得分:15)

问题在于任务计划程序的设计。正如这里指出的那样:

How does Windows Task Scheduler in Win7 recognize a failed task?

我已经在测试中验证了

  

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

如果查看计划任务的历史记录,您应该看到两个事件,“操作已完成”,然后是“任务已完成”。如果您检查“操作已完成”,它应如下所示:

  

任务计划程序成功完成任务“\ 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

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

答案 1 :(得分:0)

适用于:

抛出新异常

而不是操作成功完成。 (0x0),它会显示类似 (0xE0434362)