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



我在任务调度程序中安排了一个WPF应用程序。

我想在应用程序失败时通知任务调度程序。

在任务调度程序窗口中,在Run Result列的Task Status部分,我总是得到Success,即使应用程序抛出内部异常。

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

如何做到这一点?

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

Win7中的Windows任务调度程序如何识别失败的任务?

我已经在测试中验证过了

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

如果您查看计划任务的历史记录,您应该看到两个事件,一个是Action Completed,然后是task Completed。如果检查Action Completed,它看起来应该是这样的:

任务调度程序成功完成任务"test4",实例"{a41adae0-a378-45f6-aadc-648d27852042}",动作"C:blah..blahReleaseWpfApplication1.exe"返回代码55.

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

或者,您可以从批处理文件运行应用程序,并让批处理文件检查退出代码,并采取相应的行动。然后,您可以使用任务调度程序来调度批处理文件,而不是直接调度WPF应用程序。

关于从WPF应用程序返回退出代码,您可能需要右键单击Visual Studio中的项目属性,并在应用程序选项卡中选择输出类型的控制台应用程序。此外,在Task Scheduler中使用发布构建而不是调试构建,以确保使用了应用程序的退出代码,而不是从添加的调试内容中生成的代码。你可以测试你的应用程序是否正确地生成一个退出代码,通过使这个小批处理文件在你的exe文件的同一文件夹中运行它(替换你的应用程序的exe文件名):

wpfapplication1.exe
echo %errorlevel%
pause

您的原始代码可能会成功设置退出代码,但Shutdown是一种更温和的退出,可能不会立即退出(或根本不会退出),因为它将等待线程等优雅地退出。环境。

使用环境。退出时,您应该指定退出代码,而不是默认值0(表示成功)。可以使用

Environment.Exit(someNumber)

环境。退出

您需要一个全局异常处理程序来处理未被捕获的异常。这篇博文提供了更多的细节:http://jrich523.wordpress.com/tag/task-scheduler/

适用于:

抛出新的异常

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

的内容

最新更新